我正在尝试在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属性编辑器确保我的字段和连接条件是正确的。
我的问题是,由于我的where子句,SQL语句最终无效。 有没有办法在预处理之后看到SQL?现在我正在捕捉FireDac错误并显示EADDBEngineException对象上的SQL。但是,仍然显示我的原始SQL与宏。如果我在错误发生后无法访问它,那么无论如何都要强制进行宏替换,这样我就可以查看调试器中的SQL来帮助我查看错误。
如果重要,我将连接到MS Access数据库,目标是在不久的将来转移到SQL Server。
答案 0 :(得分:2)
除了使用Text属性,要监视哪些SQL 实际进入数据库引擎,请考虑使用" FDMonitor" FireDAC实用程序。根据DokWiki页面(如下):
请注意,TFDMoniXxxxClientLink应该在数据模块或表单创建顺序中的TFDConnection之前,因此通过右键单击表单或数据模块,然后创建订单,并将TFDMoni ..组件移动到FDConnection上方来调整此项。
此外,它有助于TFDMoniXxxxClientLink的选项,禁用正在记录的大多数事件,否则返回的所有数据也会显示在FireDAC监视器中。展开EventKinds属性,关闭所有事件类型,ekConnConnect,ekConnPrepare和ekCmdExecute除外。
然后从IDE打开FireDAC监视器(工具> FireDAC监视器)。只有在显示器运行时才启动应用程序。双击跟踪事件(在“跟踪输出”选项卡中),您将在底部窗格中看到发送到数据库的实际SQL。
如上所述,添加ekConnPrepare的EventType似乎很可能会在调用查询的准备工作时向您显示,但我确实没有足够的时间说出来。
有关详细信息,请参阅DocWiki上的以下页面:
概述:FDMonitor
如何:Tracing and Monitoring (FireDAC)
其他FireDAC实用程序:Utilities (FireDAC)
答案 1 :(得分:1)
(只是从未回答的问题列表中删除此问题)
来自评论:
好吧,我已经粗略地检查了那里发生了什么,我还没有 确定如果调用准备(这对我来说没用)是 触发预处理的最低要求。虽然, 预处理的SQL,发送到您可以访问的DBMS的SQL 通过文本属性(此类属性的名称非常罕见)。 - TLama 2月 21&14; 14:8:18