delphi - FireDAC - 在宏扩展后显示 SQL

标签 delphi delphi-xe3 firedac

我正在尝试使用 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。

最佳答案

除了使用 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 监视器)。仅在监视器运行后启动您的应用程序。双击跟踪事件(在“跟踪输出”选项卡中),您将在底部 Pane 中看到发送到数据库的实际 SQL。

按上述方式添加 ekConnPrepare 的 EventType 似乎也可能会在调用查询的“Prepare”时向您显示,但可以肯定地说,我还没有充分利用它。

请参阅 DocWiki 上的以下页面了解更多信息:

概述:FDMonitor

如何:Tracing and Monitoring (FireDAC)

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

关于delphi - FireDAC - 在宏扩展后显示 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21915973/

相关文章:

delphi - 检索数据库中保存的图像

mysql - 使用参数 Delphi XE7 Firedac

java - jna 句柄和字符串中函数映射 delphi/pascal dll

delphi - 为什么新的编译器在旧代码中无法识别“NULL”?

multithreading - 线程卡住主窗体

delphi - 如何在 Delphi XE3 中的 Firemonkey FM2 应用程序中设置非客户区的样式

delphi - 分配给多个StringList的对象的可用内存

delphi - 如何借助 DataSet 在 TAdvStringGrid 中显示数据库中的 BLOB 图像

mysql - Delphi +Firedac 和网络连接错误

Delphi + FireDAC 在ApplyUpdates 上获取数据库错误