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

私の意図は、アクティブなTClientDataSet(たとえば、var D)にAppendDataを呼び出すことです。あなたの提案は、データを非アクティブなデータセットに追加します。 –

+0

@ChauCheeYang 'AppendData'の最初の*呼び出しの後に、' D'データセットがアクティブであり、引き続き行を追加するために 'AppendData'を呼び出すことができます。 –

+0

あなたは正しいです。ただし、データセットDには、AppendRecordを使用して手動で追加する初期データがあり、部分データセットエラー以外のメッセージを表示します。 –

関連する問題