我正在转换用DBExpress编写的应用程序来使用新的FireDAC组件。打开查询,更改过滤器或排序,在网格中显示等基本操作正常。但令我感到惊讶的是,与dbexpress相比,某些函数的行为有所不同,我似乎无法理解它。
我的应用程序包含数据库编辑器。当用户打开编辑器时
通过调用方法TFDConnection::StartTransaction
启动事务。当用户单击“确定”按钮时,将提交活动事务并关闭编辑器。
在编辑器中,我使用两个查询来编辑记录。在第一个查询中,我手动编写SQL更新命令(如“update TEST set NAME='some name' where ID=1234
”)并执行它。到目前为止一切都很好。
第二个查询已连接到TDBAdvGrid
(相当于来自 TMS Software公司的TDBGrid
)并且已CachedUpdates = true
。如果我更改了该网格中的某些记录,请致电TFDQuery::Post
和TFDQuery::ApplyUpdates
。
奇怪的是,调用TFDQuery::ApplyUpdates
不仅会提交此特定查询中的挂起更改,还会提交连接到TFDConnection
实例的所有查询。我认为调用ApplyUpdates
应该发出SQL更新调用,但不应该干扰事务控制。
我想让用户选择拒绝他在数据库编辑器窗口中所做的所有更改。怎么做正确?关闭窗口时,我应该将呼叫推迟到ApplyUpdates
吗?如果所有必要的内容都是TFDQuery::CommitUpdates
的调用,那么TFDConnection::Commit
和TFDQuery::ApplyUpdates
的目的是什么?
答案 0 :(得分:0)
将TFDConnection :: TxOptions :: StopOptions :: xoIfCmdsInactive设置为false。这也将禁用TFDConnection :: TxOptions :: AutoCommit选项,应用程序可以自行控制事务。