1
:TClientDataSet.AppendData原因「非部分データセットにデータを追加しようとすると」エラー、次のコードを実行
var S, D: TClientDataSet;
P: TDataSetProvider;
i: integer;
begin
S := TClientDataSet.Create(nil);
D := TClientDataSet.Create(nil);
P := TDataSetProvider.Create(nil);
try
S.FieldDefs.Add('F1', ftString, 20);
S.FieldDefs.Add('F2', ftBcd, 2);
S.FieldDefs.Add('F3', ftBoolean);
S.CreateDataSet;
S.AppendRecord(['Test 1', 1, True]);
S.AppendRecord(['Test 2', 2, False]);
S.First;
S.MergeChangeLog;
D.FieldDefs.Add('F1', ftString, 20);
D.FieldDefs.Add('F2', ftBcd, 2);
D.FieldDefs.Add('F3', ftBoolean);
D.CreateDataSet;
P.DataSet := S;
D.SetProvider(P);
D.AppendData(P.GetRecords(-1, i, MetaDataOption), False);
finally
S.Free;
D.Free;
P.Free;
end;
end;
例外プロンプト「非部分データセットにデータを追加しようとしています」。
ただし、次のコードは動作します:
var S, D: TClientDataSet;
P: TDataSetProvider;
i: integer;
begin
S := TClientDataSet.Create(nil);
D := TClientDataSet.Create(nil);
P := TDataSetProvider.Create(nil);
try
S.FieldDefs.Add('F1', ftString, 20);
S.FieldDefs.Add('F2', ftBcd, 2);
S.FieldDefs.Add('F3', ftBoolean);
S.CreateDataSet;
S.AppendRecord(['Test 1', 1, True]);
S.AppendRecord(['Test 2', 2, False]);
S.First;
S.MergeChangeLog;
// The 4 lines below that were in the first code sample are omitted here
//D.FieldDefs.Add('F1', ftString, 20);
//D.FieldDefs.Add('F2', ftBcd, 2);
//D.FieldDefs.Add('F3', ftBoolean);
//D.CreateDataSet;
D.Data := S.Data; // This line does not appear in the first code sample
P.DataSet := S;
D.SetProvider(P);
D.AppendData(P.GetRecords(-1, i, MetaDataOption), False);
finally
S.Free;
D.Free;
P.Free;
end;
end;
私の意図は、アクティブなTClientDataSet(たとえば、var D)にAppendDataを呼び出すことです。あなたの提案は、データを非アクティブなデータセットに追加します。 –
@ChauCheeYang 'AppendData'の最初の*呼び出しの後に、' D'データセットがアクティブであり、引き続き行を追加するために 'AppendData'を呼び出すことができます。 –
あなたは正しいです。ただし、データセットDには、AppendRecordを使用して手動で追加する初期データがあり、部分データセットエラー以外のメッセージを表示します。 –