我是將 TDataSet.AppendRecord Method 變形一下:
須注意 Unique Key 重複的問題喔
procedure MyAppendRecord(CD: TDataSet; KeyValues: Variant);
var KeyArray : Array of TVarRec;
i,aCount : Integer;
begin
if VarIsArray(KeyValues) then
aCount := VarArrayHighBound(KeyValues,1) + 1
else
aCount := 1;
SetLength(KeyArray, aCount);
if VarIsArray(KeyValues) then begin
for i := 0 to aCount - 1 do begin
KeyArray[i].VType := vtVariant;
GetMem(KeyArray[i].VVariant,Sizeof(Variant));
FillChar(KeyArray[i].VVariant^,Sizeof(Variant),0);
KeyArray[i].VVariant^ := Variant(KeyValues[i]);
end;
end
else begin
KeyArray[0].VType := vtVariant;
GetMem(KeyArray[0].VVariant,Sizeof(Variant));
FillChar(KeyArray[0].VVariant^,Sizeof(Variant),0);
KeyArray[0].VVariant^ := Variant(KeyValues);
end;
CD.AppendRecord(KeyArray);
if VarIsArray(KeyValues) then
for i := 0 to aCount - 1 do
FreeMem(KeyArray[i].VVariant,Sizeof(Variant))
else
FreeMem(KeyArray[0].VVariant,Sizeof(Variant));
end;
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
Fields: string;
begin
Fields := '';
for i := 0 to Query1.FieldCount - 1 do Fields := Fields + Query1.Fields[i].FieldName+';';
MyAppendRecord(Query1,Query1[Fields]);
end;
須注意 Unique Key 重複的問題喔
procedure MyAppendRecord(CD: TDataSet; KeyValues: Variant);
var KeyArray : Array of TVarRec;
i,aCount : Integer;
begin
if VarIsArray(KeyValues) then
aCount := VarArrayHighBound(KeyValues,1) + 1
else
aCount := 1;
SetLength(KeyArray, aCount);
if VarIsArray(KeyValues) then begin
for i := 0 to aCount - 1 do begin
KeyArray[i].VType := vtVariant;
GetMem(KeyArray[i].VVariant,Sizeof(Variant));
FillChar(KeyArray[i].VVariant^,Sizeof(Variant),0);
KeyArray[i].VVariant^ := Variant(KeyValues[i]);
end;
end
else begin
KeyArray[0].VType := vtVariant;
GetMem(KeyArray[0].VVariant,Sizeof(Variant));
FillChar(KeyArray[0].VVariant^,Sizeof(Variant),0);
KeyArray[0].VVariant^ := Variant(KeyValues);
end;
CD.AppendRecord(KeyArray);
if VarIsArray(KeyValues) then
for i := 0 to aCount - 1 do
FreeMem(KeyArray[i].VVariant,Sizeof(Variant))
else
FreeMem(KeyArray[0].VVariant,Sizeof(Variant));
end;
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
Fields: string;
begin
Fields := '';
for i := 0 to Query1.FieldCount - 1 do Fields := Fields + Query1.Fields[i].FieldName+';';
MyAppendRecord(Query1,Query1[Fields]);
end;
Chance36
提供另一種解法: procedure TForm1.BitBtn1Click(Sender: TObject); Var v : variant ; Flds :String ; Sl : TStrings ; begin Sl := TStringList.create; Dataset.GetFieldNames(Sl); Flds := Sl.CommaText; Sl.Free; Flds := StringReplace(Flds,',',';',[rfReplaceAll]); // 以下與上面rovi大大的寫法是相同的 v := DataSet[Flds]; DataSet.Append; DataSet[Flds] := v; // 在這修正不同的欄位資料 DataSet.post; end;