AnyDAC (FireDAC) - 在 TBlobField.GetAsString 之后打开事务

Posted

技术标签:

【中文标题】AnyDAC (FireDAC) - 在 TBlobField.GetAsString 之后打开事务【英文标题】:AnyDAC (FireDAC) - Open transaction after TBlobField.GetAsString 【发布时间】:2018-03-05 17:08:00 【问题描述】:

目前我们正在将 Delphi7 应用程序的数据库组件从 BDE 组件迁移到 AnyDAC (FireDAC) 版本 8.0.5 组件。

给出以下先决条件:

在我们的表单上,我们有一个 TADConnection、一个 TADQuery 和一个 TADTable。 TADQuery 是 TADTable 的 MasterSource。没有对 AnyDAC 组件的设置进行特殊更改,因此 AutoCommit 模式处于活动状态。 此外,我们的表单上有一个 TDBMemo,它链接到 TADTable 的 ftMemo 字段(Firebird FieldType = Blob / Size = 240 / Subtype = Text)

在加载 blob 文本字段内容 (TBlobField.GetAsString) 期间,TADTable 会自动启动一个事务不会提交

这种行为正常吗?我们是否有可能避免这种公开交易? 请注意,目前无法停用 AutoCommit。

任何帮助表示赞赏。

【问题讨论】:

是的,这很正常。只要您不与详细元组一起获取 BLOB 数据,AnyDAC (FireDAC) 就会启动一个隐式事务。把它想象成每次从 DBMS 读取或写入 DBMS 都会发出事务。 @Victoria:如果知道他们在说什么的人(例如您)可以编辑anydactag 以提及它现在是 FireDAC,那将是很好的,因为无论什么版本的 Delphi 引入了它.. @MartynA,它已经存在了“2013 年 AnyDAC 被出售给 Embarcadero,更名为 FireDAC,仅限于支持 Delphi 平台。” @Victoria:哦,我错过了——我只是在查看标签的悬停提示。谢谢。 @Victoria:谢谢你的提示!这正是自动启动交易的原因!我可以再问你一个问题... 是否有可能检查交易的一部分?我的意思是我可以在 starttransaction 和 commit/rollback 之间检查准备好的 sql 命令吗? 【参考方案1】:

是的,这是正常行为。只要您不与详细元组一起获取 BLOB 数据,AnyDAC 就会启动一个隐式事务来获取这些 BLOB 数据。

【讨论】:

以上是关于AnyDAC (FireDAC) - 在 TBlobField.GetAsString 之后打开事务的主要内容,如果未能解决你的问题,请参考以下文章

在 AutoInc 字段中将 AnyDAC 应用程序迁移到 FireDAC 失败

AnyDac aka FireDac 无法生成更新查询

使用 AnyDAC (FireDAC) 从 SQLite 表中读取切片数据 (MBTiles) 的最有效方法是啥?

使用带有anydac(现在为firedac)脚本的参数获取错误

AnyDac - 如何断开与内存中的 sqlite db 的连接?

AnyDAC - 编辑前刷新记录