5

我正在尝试使用 FireDAC 中的宏来预处理我的 SQL 查询。我在数据模块上有一个 TADQuery 对象,其 SQL 设置为:

Select * from MyTable
  join OtherTable on MyTable.Key = OtherTable.Key
&Where

然后在我的代码中我这样做:

WhereClause = 'stuff based on my form';
Query.MacroByName('Where').AsRaw := WhereClause;
Query.Open;

这对于复杂的查询非常有用,因为它可以让我使用 SQL 属性编辑器确保我的字段和连接条件是正确的。

我的问题是 SQL 语句由于我的 where 子句而最终无效。 有什么方法可以查看要执行的预处理后的 SQL 吗?现在我正在捕捉 FireDac 错误并显示 EADDBEngineException 对象上的 SQL。但是,这仍然显示了我的原始 SQL 和宏。如果在错误发生后我无法解决它,无论如何都要强制执行宏替换,这样我就可以查看调试器中的 SQL 来帮助我了解问题所在。

如果这很重要,我将连接到 MS Access 数据库,目标是在不久的将来迁移到 SQL Server。

4

2 回答 2

2

除了使用 Text 属性之外,要监控哪些 SQL实际进入数据库引擎,请考虑使用“FDMonitor”FireDAC 实用程序。根据 DokWiki 页面(如下):

  • 在您的表单上放置一个TFDMoniRemoteClientLink组件,
  • 将其 Tracing 属性设置为True
  • 将 MonitorBy=Xxx 连接定义参数添加到现有的 FDConnection 组件。您可以在 IDE 对象检查器中执行此操作,方法是选择 FDConnection 组件、展开 Params 属性并将 MonitorBy 设置为 mbRemote。

请注意,TFDMoniXxxxClientLink 在数据模块或表单创建顺序中应位于 TFDConnection 之前,因此请通过右键单击表单或数据模块,然后单击创建顺序,并将 TFDMoni.. 组件移动到 FDConnection 上方来调整它。

此外,在 TFDMoniXxxxClientLink 的选项中,禁用大部分正在记录的事件也很有帮助,否则返回的所有数据也会显示在 FireDAC 监视器中。展开 EventKinds 属性,并关闭所有事件种类,也许 ekConnConnect、ekConnPrepare 和 ekCmdExecute 除外。

然后从 IDE 中打开 FireDAC 监视器(工具 > FireDAC 监视器)。仅在监视器运行后启动您的应用程序。双击跟踪事件(在 Trace Output 选项卡中),您将在底部窗格中看到发送到数据库的实际 SQL。

添加上面提到的 ekConnPrepare 的 EventType 似乎也可能会在调用查询的 Prepare 时向您显示,但我还没有足够肯定地说。

有关更多信息,请参阅 DocWiki 上的以下页面:

概述:FDMonitor

如何:跟踪和监控 (FireDAC)

其他 FireDAC 实用程序:实用程序 (FireDAC)

于 2016-08-23T11:02:52.267 回答
1

(只是为了从未回答的问题列表中删除这个问题)

来自评论:

好吧,我已经粗略地检查了那里发生的事情,但我仍然不确定调用Prepare(这对你来说毫无用处)是否是触发该预处理的最低要求。但是,预处理的 SQL,发送到 DBMS 的 SQL,您可以通过Text属性访问(此类属性的名称非常不常见)。– TLama 2014 年 2 月 21 日 8:18

于 2016-02-16T15:26:02.950 回答