【问题标题】:FireDAC - Show SQL after Macro ExpantionFireDAC - 宏扩展后显示 SQL
【发布时间】:2014-02-20 18:03:17
【问题描述】:

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

【问题讨论】:

  • 只是一个猜测(因为我现在手头没有FireDAC),但是您不需要调用Prepare方法来触发预处理吗?查询准备的结果应该存储在SQLText 属性中,但是这里的帮助相当混乱,我猜这个属性隐藏在TADSQLQuery 中。
  • 好吧,我已经大致检查了那里发生的事情,但我仍然不确定调用Prepare(我知道这对你没用)是否是触发该预处理的最低要求。虽然,预处理的 SQL,发送到 DBMS 的 SQL,您可以通过 Text 属性访问(此类属性的名称非常不常见)。所以,我宁愿等待一些可信的答案。好问题!
  • @TLama - 谢谢! ADQuery.Text 似乎是我需要的。我不假思索地跳过了那处房产。从您的 cmets 中,我确实在帮助文件中找到了另一个简短的参考。 Tracing and Monitoring 部分底部有一个简短的段落,标题为“检查 SQL 命令文本”。看起来我无法访问错误对象上的 .Text 属性,但能够在调试器中看到它仍然会有很大帮助。

标签: delphi delphi-xe3 firedac


【解决方案1】:

除了使用 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

如何:Tracing and Monitoring (FireDAC)

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

【讨论】:

    【解决方案2】:

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

    来自 cmets:

    嗯,我已经大致检查了那里发生的事情,但我仍然没有 确定是否调用 Prepare (据我所知,这对你没用)是 触发该预处理的最低要求。虽然, 预处理的 SQL,发送到您可以访问的 DBMS 通过 Text 属性(此类属性非常不常见的名称)。 – TLama 二月 2014 年 2 月 21 日 8:18

    【讨论】:

    • 但肯定有一条评论说“所以,我宁愿等待一些可信的答案。”几乎不是作为答案发布的理想人选?
    • 在“ADQuery.Text 似乎是我需要的”上下文中。答案——是的。 FireDAC 中确实没有其他方法可以查看最终文本,作为命令传输到 DBMS 服务器。
    • 在我们的应用程序中,我们拥有自己的 FireDAC 库副本并进行了一些修复,其中一些通过 Exception 对象将此文本传输到异常处理程序,这使用户可以看到更多信息性异常描述以及最终文本和所有参数和调用上下文的大部分信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多