【问题标题】:FireDAC ApplyUpdates and transaction controlFireDAC ApplyUpdates 和事务控制
【发布时间】:2016-04-18 13:59:56
【问题描述】:

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

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

在编辑器中,我使用两个查询来编辑记录。在第一个查询中,我手动编写 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::ApplyUpdates,那么TFDQuery::CommitUpdatesTFDConnection::Commit 的目的是什么?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2019-04-11
      • 2013-09-09
      相关资源
      最近更新 更多