Delphi 和 Firedac:查询活动与查询打开

Posted

技术标签:

【中文标题】Delphi 和 Firedac:查询活动与查询打开【英文标题】:Delphi and Firedac : query Active vs query Open 【发布时间】:2017-06-09 06:36:19 【问题描述】:

我的应用程序的大多数表单都使用 2 个或更多 db 网格:基本上,用户单击主网格中的记录并在辅助网格中获取子结果。

我的所有主要 DBGrids FDQueries(即带有 SELECT 的那个)都已在表单上设置,但没有一个是“活动的”,它们在 FormShow 上触发。

我注意到了,不管我写:

FDQuery1.Active := True;

FDQuery1.Open;

结果是一样的:我的行显示在主 DBGrid 中。

因此,我在FormClose 上致电CloseActive := False

但这些方法之间肯定存在差异,这是我的问题的主题:Query.OpenQuery.Active := True; 之间有什么区别?

如果有任何显着差异,我应该使用什么?

提前致谢

数学,当你花时间回答我的问题时,菜鸟越来越少:)

旁注:我的 INSERT 和 UPDATE 查询是使用 CLEAR 设置的,然后是 SQL.ADD,然后是参数声明,最后是 ExecSQL

【问题讨论】:

它们是一样的。您拥有 Active 属性的原因是您可以在设计时从对象检查器中激活查询。将 Active 设置为 True 内部调用 Open。我更喜欢Open/Close 方法,因为这些方法的作用非常清楚(代码可读性)。 【参考方案1】:

Active 是一个属性,Open 是一个方法。 Active 设置为 true 时调用 Open 方法,设置为 false 时调用 Close。 Active 很有用,因为它可以用来检查数据集是否真正打开。

if Qry.Active then DoSomething;

【讨论】:

询问查询是否为Active 并按该状态行事是代码异味。尽管您是对的,但我在这里要指出的主要区别是 Active 是可以在设计时使用的已发布属性,而 Open 是只能在运行时使用的方法。我是为了自我描述的代码,所以我个人更喜欢Open/Close对。【参考方案2】:

旁注:然后我的 INSERT 和 UPDATE 查询设置为 CLEAR, SQL.ADD,然后是参数声明,最后是 ExecSQL

ActiveOpen 之间没有区别。(请参阅 whosrdaddy 评论)它们做同样的事情 - 数据集变为活动状态并从 SELECT 语句返回结果。

您还可以使用属性Active 来检查数据集是否处于活动状态,例如:

if not MyQuery.Active then 
  MyQuery.Open; // or MyQuery.Active := true;

ExecSQL 执行不向数据返回游标的查询(例如 INSERT、UPDATE、DELETE 和 CREATE TABLE)。

【讨论】:

以上是关于Delphi 和 Firedac:查询活动与查询打开的主要内容,如果未能解决你的问题,请参考以下文章

FIREDAC的TFDJSONDataSets和TFDJSONDeltas查询和提交数据

firedac引擎DATASNAP多表查询和多表提交

使用 FireDac 在 Delphi 中动态创建和调用存储过程的正确方法是啥?

Delphi:从 IBO 迁移到 FireDac

删除记录时出现 NO_SQL_DATA 错误,firedac,delphi 10.3.1

将记录从一个 db 迁移到 mysql 使用 Delphi 和 Firedac 非常慢