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

时间:2012-04-19 18:19:47

标签: delphi tclientdataset tdatasetprovider

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

因此,假设您在原始数据集中获得了以下字段:

  • 客户ID
  • 名称
  • 年龄

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

我现在这样做的方式:

  1. 创建2个TClientDataset对象(Origin和Target)
  2. 在Origin中,我加载从InternalGetRecords方法的参数中获取的数据(我覆盖它)
  3. 在Target中,我创建了从Origin数据集定义的fielddef,并添加了开发人员在设计时创建的fielddef
  4. 在Target上执行CreateDataset
  5. 并且,逐行(和逐个字段),我将数据从Origin数据库复制到Target数据集
  6. 最后,将Data变量作为InternalGetRecords的返回值返回。
  7. 我真的不知道是否有更优雅(更快)的方法。还有另一种(更快和/或更优雅)的方法来获得这种结果吗?

4 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:1)

最快的方法是使用CloneCursor。像这样:

  1. 创建2个TClientDataset对象(Origin和Target)
  2. 在Origin中,加载从InternalGetRecords方法的参数中获取的数据
  3. 在Target中,创建从Origin数据集定义的fielddef,并添加由开发人员在设计时创建的fielddef
  4. Target.CloneCursor(Origin); //there are more params than this, but this is the basic idea
  5. Target现在将包含与Origin相同数据的新视图,但受Target上存在的任何字段,过滤器等的限制。 (如果你没有定义任何字段,它会复制Origin的字段。如果你确定了字段,那么它会坚持你给它的东西。)
  6. 从Target复制数据,这应该是您正在寻找的。

答案 2 :(得分:0)

我有一个示例,可以动态地将字段添加到CDS,使用匿名方法计算单个字段,以获得更大的灵活性。在打开CDS之前,添加计算字段,而不是打开它..

这是你在找什么?问题不是很明确......

答案 3 :(得分:-1)

您可以使用TClientDataset的Data属性来复制整个数据集,元数据和数据。这应该是将一个TClientDataset复制到另一个TClientDataset的最快方法。

请参阅http://docwiki.embarcadero.com/RADStudio/en/Assigning_Data_Directly