【问题标题】:Add writable dummy field to updatable TClientDataset将可写虚拟字段添加到可更新的 TClientDataset
【发布时间】:2012-05-05 23:28:54
【问题描述】:

我有一个需要在其中插入记录的数据库表。 我正在使用可更新的 TClientDataset,一切正常。

现在,我需要添加一个虚拟字段;不是经过计算的。 我可以在其中写入行状态的一个字段(只是我将在 ApplyUpdates 之前使用的一些信息),但这不是数据库表的一部分。

我看过this illuminating post,但是添加的字段是计算出来的,无法更新和保留信息。 不适合我。

我尝试从数据库选择中添加一个“虚拟字段”并修复 ProviderFlags 以删除 pfUpdate。

cds.CommandText := 'SELECT 1 AS DUMMY , CUSTOMERS.* FROM CUSTOMERS';
cds.Open;
cds.FieldByName('DUMMY').ProviderFlags := [];

我在 Provider.pas 中看到,在构建插入 sql 之前,会检查 ProviderFlags。这应该确实有效,问题是 ProviderFlags 似乎没有从我上面的声明中更新。

请问,您知道如何动态添加一个字段,该字段是可写的,但会被 delphi 数据库更新过程忽略?

我正在使用 delphi 7。

感谢您的帮助。

【问题讨论】:

  • 您是否有某些原因不能仅仅敲出一些东西来保存对数据行和您的状态结构的引用。为您省去很多麻烦。
  • 因为我没有状态的外部数据结构。除了数据集之外,我也不想创建它们。 Uwe Raabe 提出的解决方案完全没有痛苦和混乱。
  • 在我看来,这两个原因都不是问题,但@Uwe 建议的方法看起来问题更小。
  • 不能在客户端以这种方式设置 ProviderFlags。您应该使用可选参数 szPROVFLAGS 或在提供者端设置它
  • @vavan,AFAIK 你确实可以在客户端设置 TField.ProviderFlags 。 szPROVFLAGS 仅用于通过数据集提供者将提供者标志作为字段属性从“服务器”传输到客户端。这发生在打开数据集期间,因此之后对该字段的任何更改都应保持有效。此外,仅当提供者端的 ProviderFlags 与默认的 [pfInWhere, pfInUpdate] 不同时才会进行此传输。

标签: delphi delphi-7 tclientdataset


【解决方案1】:

将该字段设为InternalCalc 字段并将其ProviderFlags 设置为[]。这使得该字段对您的应用程序可写,但在更新底层数据库时会跳过该字段。

【讨论】:

  • 谢谢 Uwe!而已!我已经实现了这个并且像一个魅力一样工作。无论如何,我不需要设置 ProviderFlags。使字段 InternalCalc 就足够了
猜你喜欢
  • 2019-12-12
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多