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:如果知道他们在说什么的人(例如您)可以编辑anydac
tag 以提及它现在是 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 (FireDAC) 从 SQLite 表中读取切片数据 (MBTiles) 的最有效方法是啥?
使用带有anydac(现在为firedac)脚本的参数获取错误