将数据从数据集结构移动到另一个数据库的更快方法(在TDatasetProvider中)

Fab*_*ujo 12 delphi tclientdataset tdatasetprovider

我有一个自定义的TDatasetProvider,允许为它提供的任何数据创建新的字段.

所以,假设您在原始数据集上获得了以下字段:

  • 顾客ID
  • 名称
  • 年龄

您需要使用显示位图在DBGrid上选择它.好吧,你可以,因为我的DSP可以添加一个调用Selected数据集数据的布尔字段.

我现在这样做的方式:

  1. 创建2个TClientDataset对象(Origin和Target)
  2. 在Origin中,我加载从InternalGetRecords方法的参数获得的数据(我覆盖它)
  3. 在Tar​​get中,我创建了从Origin数据集定义的fielddef,并添加了开发人员在设计时创建的fielddef
  4. 在Tar​​get上执行CreateDataset
  5. 并且,逐行(和逐个字段),我将数据从Origin数据库复制到Target数据集
  6. 最后,将Data变量作为InternalGetRecords的返回值返回.

我真的不知道是否有更优雅(和更快)的方式来做到这一点.有另一种(更快和/或更优雅)的方式来获得这个结果?

Ond*_*lle 13

似乎从源数据集加载数据后,您可以调用IDSBase.AddField添加更多字段:

uses
  DB, DBCommon, DBClient, DSIntf;

type
  THackClientDataSet = class(TClientDataSet);

procedure EncodeFieldDesc(var FieldDesc: DSFLDDesc;
  const Name: string; DataType: TFieldType; Size, Precision: Integer;
  Calculated: Boolean; Attributes: TFieldAttributes);
begin
  // ... copied from TClientDataSet.EncodeFieldDesc
end;

//...
var
  FldDesc: DSFLDDesc;
begin
  FillChar(FldDesc, SizeOf(FldDesc), 0);
  EncodeFieldDesc(FldDesc, 'SELECTED', ftBoolean, 0, 0, False, []);
  with THackClientDataSet(DataSet) do
    Check(DSBase.AddField(@FldDesc));
  // now you can create a second client dataset and assign it DataSet.Data directly:
  // DataSet2.Data := DataSet.Data;
  // DataSet2 now contains the new field (with empty values in all existing records)
end;
Run Code Online (Sandbox Code Playgroud)

我没有彻底测试它,但上面的简单示例按预期工作,我能够导航第二个客户端数据集并像往常一样编辑所有字段的值.