【发布时间】:2012-11-10 10:23:49
【问题描述】:
Precis:我的代码正在尝试更新 Delphi XE TClientDataset 中的非物理字段(连接到带有 SQL 属性集的 TSQLQuery),这些字段是由运行时 Open 命令创建的.
我有一个 TClientDataset 连接到一个 TDatasetProvider 连接到一个 TSQLQuery 连接到一个 TSQLConnection。这些对象中的前 3 个被封装在一个库中的几个类中,我在多个项目的许多地方都使用了这些类。这些类在运行时创建这 3 个对象,并消除了大量重复代码,因为我有很多很多这样的三元组。
通常我会通过在TSQLQuery 的SQL 属性中指定一些SQL 并在TClientDataSet 上调用Open 从数据库中加载TClientDataset。 TClientDataset 中的 Fields 是通过对 Open 的调用创建的,即。它们在Open 之前不存在。
我遇到了一个问题,其中TClientDataset 中生成的三个字段是非物理的;也就是说,SQL 进行计算以生成它们。不幸的是,在TClientDataset 中,这三个字段的创建与物理字段没有任何不同;他们的FieldKind 是fkData(理想情况下是fkInternalCalc),Calculated 属性是False(理想情况下是True)并且他们的ProviderFlags 包括pfInUpdate(理想情况下不应该)。毫不奇怪,当需要在 TClientDataset 上执行 ApplyUpdates 时,会引发异常...
Project XXX.exe raised exception class TDBXError with message
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'Received'.
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'Issued'.
SQL State: 42S22, SQL Error Code: 207 Invalid column name 'DisplayTime'.
我可以通过在TDatasetProvider 的OnUpdateData 事件处理程序中清除这些字段的pfInUpdate 标志来避免此错误。然而,这种解决方案要求位于上述通用类中的该函数知道特定的字段名称,从而破坏了代码的通用性。
我正在寻找一种将这些字段的计算性质发信号通知给事件处理函数的通用方法。
在调用Open 之后,我无法更改它们的FieldKind 或Calculated 属性(分别更改为fkInternalCalc 和True),因为这会生成WorkCDS: Cannot perform this operation on an open dataset 异常消息。而且,我无法在调用 Open 之前更改这些属性,因为 Fields 尚不存在。
我可以在Open 之后从这些Field 的ProviderFlags 属性中删除pfInUpdate 标志,但这不会传递到到达OnUpdateData 事件处理程序的“Delta”TClientDatset。我还尝试设置该字段的 FieldDefs.InternalCalcField 属性;再次,这不会传递给 Delta 数据集。
所以,我尝试过的所有信号想法都没有奏效。如果有任何新想法或替代方法,我将不胜感激。
我遇到的所有互联网搜索结果(包括 Cary Jensen 的优秀文章)都处理不适用于我的情况的设计时或非 SQL 生成的设置。
【问题讨论】:
-
你的组件是从 TClientDataSet 派生的还是一个组合?
-
希望我能理解您的问题。我提到的两个类本身不是组件,而是它们包含 TClientDataSet、TDataSetProvider 和 TSQLQuery 类,它们都不是派生的,即。未分类。在这两个类中,一个派生自另一个,但两者的基类仅派生自 TObject。
-
你如何打开内部的ClientDataSet?我的意思是,你是调用类的方法还是直接调用内部的 ClientDataSet.Open 方法?
-
内部TClientDataSet直接调用Open方法。 TClientDataSet 在我的派生类的构造函数中作为 var 参数返回,因为它在我的类外部的代码中广泛使用。
-
我想到的更好的方法是将其更改为在您的类上调用 Open (或任何名称)方法,然后 Opens i> 内部 ClientDataSet。好消息是您不必更改所有代码库,而只需更改那些您想忽略 ApplyUpdates 更新中的某些字段的地方。
标签: windows delphi tclientdataset