C++ Builder & ADO - 如何在触发器执行后显示正确的值?

C++ Builder & ADO - how to show correct values after trigger execution?

我创建了一个简单的测试应用程序,它使用 ADO 组件 (TADOTable) 和 TDBGrid 来插入和更新 table 记录。 SQL 我使用的服务器数据库 table 具有 INSTEAD OF INSERT, UPDATE 触发器,该触发器将列的第一个字符大写 'Name'。

问题是 TDBGrid 不知道触发器所做的更改,只有在重新打开 table 之后我才能看到正确的值。如果我将列 'Name' 的值设置为 'test',则存储在数据库 table 中的值是正确的 - 'Test',但 TDBGrid 显示不正确的值 - 'test'.

如何强制 TDBGrid 和其他 TDB 组件在触发器执行后自动显示正确的值?

ADO 有 Dynamic Properties 可以用于此目的。 您可以将 Update Resync 属性 设置为 adResyncAutoIncrement or adResyncUpdates or adResyncInserts:

uses ..., ADOInt;

ADODataSet1.Properties['Update Resync'].Value := 
  adResyncAutoIncrement or adResyncUpdates or adResyncInserts;

在您打开数据集后,ADO 将重新同步 inserted/updated 记录。您还必须有一个 PK IDENTITY 列。

您还可以使用:

ADODataSet1.Properties['Update Criteria'].Value := adCriteriaKey;

以便 ADO 仅使用 PK 进行更新。

就我个人而言,我不会为此使用触发器,而是会使用 OnBeforePost 将文本大写。

顺便说一句,我强烈建议不要养成使用 TADOTable 的习惯,它会在内部始终使用 SELECT * FROM。请改用 TADODataSet