FireDAC ApplyUpdates和事务控制

时间:2016-04-18 13:59:56

标签: transactions firebird2.5 firedac dbexpress c++builder-xe7

我正在转换用DBExpress编写的应用程序来使用新的FireDAC组件。打开查询,更改过滤器或排序,在网格中显示等基本操作正常。但令我感到惊讶的是,与dbexpress相比,某些函数的行为有所不同,我似乎无法理解它。

我的应用程序包含数据库编辑器。当用户打开编辑器时 通过调用方法TFDConnection::StartTransaction启动事务。当用户单击“确定”按钮时,将提交活动事务并关闭编辑器。

在编辑器中,我使用两个查询来编辑记录。在第一个查询中,我手动编写SQL更新命令(如“update TEST set NAME='some name' where ID=1234”)并执行它。到目前为止一切都很好。

第二个查询已连接到TDBAdvGrid(相当于来自 TMS Software公司TDBGrid)并且已CachedUpdates = true。如果我更改了该网格中的某些记录,请致电TFDQuery::PostTFDQuery::ApplyUpdates

奇怪的是,调用TFDQuery::ApplyUpdates不仅会提交此特定查询中的挂起更改,还会提交连接到TFDConnection实例的所有查询。我认为调用ApplyUpdates应该发出SQL更新调用,但不应该干扰事务控制。

我想让用户选择拒绝他在数据库编辑器窗口中所做的所有更改。怎么做正确?关闭窗口时,我应该将呼叫推迟到ApplyUpdates吗?如果所有必要的内容都是TFDQuery::CommitUpdates的调用,那么TFDConnection::CommitTFDQuery::ApplyUpdates的目的是什么?

1 个答案:

答案 0 :(得分:0)

将TFDConnection :: TxOptions :: StopOptions :: xoIfCmdsInactive设置为false。这也将禁用TFDConnection :: TxOptions :: AutoCommit选项,应用程序可以自行控制事务。