TClientDataSet.AppendData导致“尝试将数据附加到非部分数据集”错误

时间:2011-12-30 02:14:29

标签: delphi

执行以下代码时:

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;

1 个答案:

答案 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;