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
上致电Close
或Active := False
。
但这些方法之间肯定存在差异,这是我的问题的主题:Query.Open
和 Query.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
Active
和 Open
之间没有区别。(请参阅 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 在 Delphi 中动态创建和调用存储过程的正确方法是啥?