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

标签 delphi tclientdataset tdatasetprovider

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

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

  • 客户 ID
  • 姓名
  • 年龄

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

我现在这样做的方式:

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

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

最佳答案

看来从源数据集中加载数据后,可以调用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;

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

关于delphi - 将数据从一个数据集结构移动到另一个数据集结构的更快方法(在 TDatasetProvider 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234325/

相关文章:

delphi - 构建支持继承的对象工厂

multithreading - 来自线程的同步事件 - 内存泄漏

delphi - try/except 似乎没有捕获异常 - Delphi 服务应用程序

delphi - 如何自动删除未更新的clientdataset记录

delphi - TClientDataset 组件应该位于哪里?

delphi - 检查 TClientDataset 中的行是否已更改

delphi - 如何通过 FireDac (Delphi) 从 FireBird 数据库流式传输使用 zlib 压缩的图像