2011-12-30 11 views
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; 

回答

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; 
+0

我的目的是AppendData調用成活性的TClientdataSet(例如:VAR d)。您的提議將數據追加到不活動的數據集中。 – 2011-12-30 08:26:50

+0

@ChauCheeYang對* AppendData進行* first *調用後,數據集'D'處於活動狀態,您仍然可以繼續調用AppendData來添加更多行。 – 2011-12-30 09:13:50

+0

你說得對。但是,數據集D具有使用AppendRecord手動追加的初始數據,並且會提示非部分數據集錯誤。 – 2011-12-30 10:38:35