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
。
我创建了一个简单的测试应用程序,它使用 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
。