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;
我的目的是AppendData調用成活性的TClientdataSet(例如:VAR d)。您的提議將數據追加到不活動的數據集中。 – 2011-12-30 08:26:50
@ChauCheeYang對* AppendData進行* first *調用後,數據集'D'處於活動狀態,您仍然可以繼續調用AppendData來添加更多行。 – 2011-12-30 09:13:50
你說得對。但是,數據集D具有使用AppendRecord手動追加的初始數據,並且會提示非部分數據集錯誤。 – 2011-12-30 10:38:35