Precis:我的代码试图更新作为运行时命令的结果创建的 Delphi XE 中的非物理字段(通过其属性集TClientDataset
连接到 a )。TSQLQuery
SQL
Open
我有一个TClientDataset
连接到一个TDatasetProvider
连接到一个TSQLQuery
连接到一个TSQLConnection
。这些对象中的前 3 个被封装在一个库中的几个类中,我在多个项目的许多地方都使用了这些类。这些类在运行时创建这 3 个对象,并消除了大量重复代码,因为我有很多很多这样的三元组。
通常我会通过在 的属性中指定TClientDataset
一些 SQL并调用. 通过对ie的调用创建in 。它们之前不存在。SQL
TSQLQuery
Open
TClientDataSet
Fields
TClientDataset
Open
Open
我遇到了一个问题,其中生成的三个字段TClientDataset
是非物理的;也就是说,SQL 进行计算以生成它们。不幸的是,在 中TClientDataset
,这 3 个字段的创建与物理字段没有任何不同;它们FieldKind
是fkData
(理想情况下应该是fkInternalCalc
),Calculated
属性是False
(理想情况下应该是True
)和它们的ProviderFlags
包含pfInUpdate
(理想情况下不应该是)。毫不奇怪,当需要ApplyUpdates
对TClientDataset
抛出异常进行处理时......
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'.
我可以通过在'事件处理程序中清除这些字段的pfInUpdate
标志来避免此错误。但是,此解决方案要求该函数知道位于上述通用类中的特定字段名称,从而破坏了代码的通用性。TDatasetProvider
OnUpdateData
我正在寻找的是一种将这些字段的计算性质信号传递给事件处理函数的通用方法。
调用后我无法更改它们的FieldKind
或Calculated
属性(分别为fkInternalCalc
和True
),Open
因为这会生成WorkCDS: Cannot perform this operation on an open dataset
异常消息。而且,我不能在Open
调用之前更改这些属性,因为Fields
它们还不存在。
之后我可以从这些属性中删除pfInUpdate
标志,Field
但这不会传递到到达事件处理程序的“Delta”上。我还尝试设置字段的属性;同样,这不会传递给 Delta 数据集。ProviderFlags
Open
TClientDatset
OnUpdateData
FieldDefs.InternalCalcField
所以,我尝试过的所有信号想法都没有奏效。如果有任何新想法或替代方法,我将不胜感激。
我遇到的所有 Internet 搜索结果(包括 Cary Jensen 的优秀文章)都处理不适用于我的情况的设计时或非 SQL 生成的设置。