【问题标题】:How to modify calculated field with TADODataSet?如何使用 TADODataSet 修改计算字段?
【发布时间】:2013-03-15 07:29:31
【问题描述】:

我有一个TADODataset 执行(仅作为示例):

SELECT id, name, lastname, name + ' ' + lastname as fullname
FROM persons
ORDER BY lastname

打开数据集后,我可以修改"name""lastname"字段,但不能修改"fullname",因为是计算出来的。

我尝试通过DataProvider打开TADODatasetTClientDataset,但是时间太长(源数据集中大约有100K条记录):

SrcDS.FieldDefs.Update;
for i := 0 to Pred(SrcDS.FieldDefs.Count) do
  SrcDS.FieldDefs[i].CreateField(SrcDS).ReadOnly := false;
DestDS := TClientDataset.Create(nil);
DestDS.SetProvider(SrcDS);
DestDS.Open;
DestDS.SetProvider(nil);

总而言之,我希望拥有一个具有可变字段的独立数据集。
如何修改数据集中的计算字段?

【问题讨论】:

  • 您希望全名可编辑 - 然后呢?您不能将其写回数据库(除非您在事件处理程序中将其解析回名称和姓氏,这很容易出错)。你想用全名完成什么?
  • 我不想写回数据库。链接到 TcxGrid 组件的数据集。我只想在客户端更改数据集,因此更改将显示在组件中。
  • 您通过更改其组件来更改全名...当您不回写它们时,允许编辑全名有什么用?除非您要拆分新的全名并将拆分结果写入名字/姓氏字段?在这种情况下:使用多元文化名称会很有趣。
  • 这只是展示计算字段的例子
  • +1 这是个好问题。我试图在某个时候实现相同的行为。我的结论是,这是不可能的。即使使用LockType = ltBatchOptimistic,您可以编辑计算的字段,但我没有找到方法告诉提供者更新在@987654331 期间对 calc 字段所做的更改@.

标签: delphi delphi-xe tclientdataset calculated-field tadodataset


【解决方案1】:

您必须在 Delphi 中计算字段。通过右键单击 TADODataset 组件创建一个新字段,选择New Field,为其命名并将其类型设置为“计算”。

在 OnCalculateFields-Event 中简单地写:

Procedure TMyDataModule.MyDatasetCalculate(Sender : TDataset);
Begin
  MyDataSetFullName.AsString := MyDatasetFirstName.AsString+' '+MyDataSetLastName.AsString;
End;

更新:关于您的第二个问题(100.000 条记录):如果您使用 LockType = ltBatchOptimistic 将它们加载到您的 ADODataset 中,它将足够快并且不会将任何内容保存到数据库中,除非您调用 UpdateBatch 方法。

如果这仍然太慢,请尝试使用异步加载功能(请参阅ExecuteOptions

【讨论】:

  • 悲伤,但真实:我需要修改当前数据集或快速创建它的副本
  • "我需要修改当前数据集或快速创建它的副本" ??这是什么意思
  • 只修改数据集,不写回数据库。
  • 好的,你仍然想要例如更改名字,全名也会自动更改?然后你可以使用LockType = ltBatchOptimistic 最后丢弃/取消更改。但是还是得在Delphi中做字段计算(自然)
  • @Tona,“仅修改数据集,不将其写回数据库”。您不想将“姓名,姓氏”写回数据库吗?如果是,alzaimar 给了你正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多