1

我想将 ClientDataSet 保存到文件,然后在 AdoQuery (AdoQuery.LoadFromFile()) 中打开这个文件。可能吗?

或者如何将数据集保存为 pfADTG 文件格式?

此致

帕维尔

4

1 回答 1

3

我想将 ClientDataSet 保存到文件,然后在 AdoQuery (AdoQuery.LoadFromFile()) 中打开这个文件。可能吗?

不,TClientDataSet 和 TCustomAdoDataSet 后代(如 TAdoQuery)使用的文件格式彼此不兼容,无论是二进制版本还是 XML 版本。我想您可以尝试使用 Delphi 的 TXmlTransform 将保存的 CDS 文件转换为 Ado 格式,但我自己从未这样做过。

或者如何将数据集保存为 pfADTG 文件格式?

如果“数据集”是指 TClientDataSet,则不能直接执行此操作。您可以做的最好的事情是从 CDS 到 AdoQuery 的逐个字段、逐行复制,然后在 AdoQuery 上调用 SaveToFile。

更新: 在对此答案的编辑中,恐怕我不得不拒绝,您问如果您的 AdoDataSet 为空且没有连接字符串该怎么办;好吧,当然可以使用 TAdoDataSet 使用 SaveToFile 和 LoadFromFile 在本地存储数据。下面是一个极简项目,它创建并填充 ClientDataSet,然后将其结构和数据复制到 AdoDataSet。

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  //  Note: ClientDataSet1 has had two FieldDefs created in the IDE,
  //  an ID integer field and an AName string field with a size of 20

  // Create and populate ClientDataSet1
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.InsertRecord([1, 'Name1']);
  ClientDataSet1.InsertRecord([2, 'Name2']);

  //  Copy ClientDataSet1's FieldDefs to AdoDataSet1 
  AdoDataSet1.FieldDefs.Assign(ClientDataSet1.FieldDefs);

  //  Now, copy the data fielf-by-field, row-by-row
  AdoDataSet1.CreateDataSet;

  try
    ClientDataSet1.DisableControls;
    AdoDataSet1.DisableControls;
    ClientDataSet1.First;
    while not ClientDataSet1.Eof do begin
      AdoDataSet1.Insert;
      for i := 0 to ClientDataSet1.FieldCount - 1 do begin
        AdoDataSet1.Fields[i].Value := ClientDataSet1.Fields[i].Value;
      end;
      AdoDataSet1.Post;
      ClientDataSet1.Next;
    end;

  //  Save Ado data to file, beware of path used!
  AdoDataSet1.SaveToFile(ExtractFilePath(Application.ExeName) + 'AdoData', pfADTG);

  finally
    AdoDataSet1.EnableControls;
    ClientDataSet1.EnableControls;
  end;
end;
于 2017-09-30T17:05:34.540 回答