FireDAC ApplyUpdates 和事务控制
FireDAC ApplyUpdates and transaction control
我正在转换用 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
.
Whats weird calling TFDQuery::ApplyUpdates
不仅会提交此特定查询中的未决更改,还会提交连接到 TFDConnection
实例的所有查询。我认为调用 ApplyUpdates
应该发出 SQL 更新调用但不应干扰事务控制。
我想为用户提供拒绝他在数据库编辑器中所做的所有更改的选项 window。如何正确地做到这一点?我应该将对 ApplyUpdates
的呼叫推迟到关闭 window 的时间吗?如果只需要调用 TFDQuery::ApplyUpdates
,那么 TFDQuery::CommitUpdates
和 TFDConnection::Commit
的目的是什么?
将 TFDConnection::TxOptions::StopOptions::xoIfCmdsInactive 设为假。这也将禁用 TFDConnection::TxOptions::AutoCommit 选项,并且应用程序可以自行控制事务。
我正在转换用 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
.
Whats weird calling TFDQuery::ApplyUpdates
不仅会提交此特定查询中的未决更改,还会提交连接到 TFDConnection
实例的所有查询。我认为调用 ApplyUpdates
应该发出 SQL 更新调用但不应干扰事务控制。
我想为用户提供拒绝他在数据库编辑器中所做的所有更改的选项 window。如何正确地做到这一点?我应该将对 ApplyUpdates
的呼叫推迟到关闭 window 的时间吗?如果只需要调用 TFDQuery::ApplyUpdates
,那么 TFDQuery::CommitUpdates
和 TFDConnection::Commit
的目的是什么?
将 TFDConnection::TxOptions::StopOptions::xoIfCmdsInactive 设为假。这也将禁用 TFDConnection::TxOptions::AutoCommit 选项,并且应用程序可以自行控制事务。