我需要拦截在ADO连接组件和数据库服务器之间传递的所有SQL命令。类似于dbExpress的TSQLmonitor,但对于ADO。
有人知道任何实现此功能的第三方组件吗?
更新
我想要做的是在不使用外部工具的情况下以编程方式(通过代码)从我的应用程序监视SQL语句。对于任何数据库引擎。
答案 0 :(得分:8)
我找到了一个解决方案,使用事件TAdoConnection.OnWillExecute(在数据库服务器发出接收命令执行信号后发生。)
更多信息here
procedure TDataModuleProd.ADOConnection1WillExecute(
Connection: TADOConnection; var CommandText: WideString;
var CursorType: TCursorType; var LockType: TADOLockType;
var CommandType: TCommandType; var ExecuteOptions: TExecuteOptions;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
begin
AddLog(CommandText);
end;
我在博客上写了一篇小文章,供那些想要更多信息的人使用。
http://theroadtodelphi.wordpress.com/2010/02/21/build-your-own-profiler-using-ado/
答案 1 :(得分:6)
如果您的数据库是MS-SQL,则可以使用 SQL Profiler 工具监控SQL流量。有很多关于如何设置它的教程,包括this one。
答案 2 :(得分:0)
因为您要求任何数据库引擎,我相信唯一可靠的方法是检测应用程序以在执行SQL之前记录SQL。有几种方法可以做到这一点,从现有TAdoxxxx创建后代对象到创建简单函数,每次想要检查时都必须记住这些函数。就日志记录而言,首选方法之一是使用outputdebugstring将其发送到调试控制台。当delphi运行时,它将显示在消息窗口中。有一个可以在远程系统上使用的独立可执行文件DebugView。
如果您只是想在调试时访问SQL(以便可以在应用程序外部测试和调优)以及使用tAdoQuery组件,则可以使用调试评估程序将其保存到文件中。只需在打开之前设置一个断点,然后在断点处运行调试评估程序并输入查询组件的名称,然后输入:.sql.savetofile('c:\sqlfilename.sql')
然后按回车键,它会将整个现有SQL保存到文件指定。如果您正在生成SQL,或者太大而无法使用调试检查器进行查看,这可以成为救生员。
答案 3 :(得分:0)
我已经发布了如何使用Windbg作为SQL profiler来从应用程序获取所有sql调用。
可以很容易地将其更改为用于任何数据库。有了这个我试图证明,我们如何从堆栈底部追踪一些东西。