执行以下代码时:
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;
答案 0 :(得分:0)
从第一个代码中删除D.CreateDataSet;
,您就可以了。看起来数据集在调用CreateDataSet
时不接受任何部分更新。
procedure TForm7.Button3Click(Sender: TObject);
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;
P.DataSet := S;
D.SetProvider(P);
D.AppendData(P.GetRecords(-1, i, MetaDataOption), False);
finally
S.Free;
D.Free;
P.Free;
end;
end;