Delphi 有没有办法找到是谁在TADOConnection的一个ExecuteComplete事件中开枪的?

Delphi 有没有办法找到是谁在TADOConnection的一个ExecuteComplete事件中开枪的?,delphi,profiler,tadoquery,Delphi,Profiler,Tadoquery,我正在尝试用Delphi7编写一个ADO数据库探查器。 它是Delphi项目的一部分 我正在使用OnExecuteComplete事件,但在某些PC上,我收到了“MSADO15.DLL”访问冲突错误 我已经研究并发现一些win版本不兼容、损坏或版本不同 当我使用“Command”的参数[i].value属性时发生AV错误。。 然后我决定写一种不同的类型, 现在我需要一个对象的引用,该对象在ADOConnection中调用了OnExecuteComplete事件。 如果我能做到,问题就会解决 我使

我正在尝试用Delphi7编写一个ADO数据库探查器。 它是Delphi项目的一部分

我正在使用
OnExecuteComplete
事件,但在某些PC上,我收到了“MSADO15.DLL”访问冲突错误

我已经研究并发现一些win版本不兼容、损坏或版本不同

当我使用“Command”的
参数[i].value
属性时发生AV错误。。 然后我决定写一种不同的类型, 现在我需要一个对象的引用,该对象在ADOConnection中调用了
OnExecuteComplete
事件。 如果我能做到,问题就会解决

我使用“Command”和“Recordset”引用来比较通过此ADO连接链接的所有ADO对象,但有些ADO对象没有记录集。。
有没有办法找到是谁开的那场比赛?喜欢发送者吗?

如果不是零,发送者应该给你一个线索。将其强制转换为TComponent,并使用其Name属性找出触发它的组件:

ShowMessage((Sender as TComponent).Name);
如果发送方为nil,堆栈跟踪可能会有所帮助

更新
显然没有发送方参数。在这种情况下,连接必须是触发它的类,因此获取其名称和其他数据。您可以获得足够的参数来了解发生了什么。

我无法确定您是否在.Net中,但在.Net中很容易。用于查看导致事件的整个调用堆栈

对于本机代码,如果您在调试模式下编译,可能还有一种获取stacktrace的方法。我已经有一段时间没有编写Delphi(或Pascal)代码了。您还可以尝试使用免费的评测工具进行评测,该工具可以与Delphi(本机和.Net)配合使用,Delphi还具有一个功能。

我解决了它! 我编写了两个驱动类,分别来自ADOQuery和ADOStoredProc。 然后发布它们的命令属性。 通过强制将StoredProcedure转换为新类,我到达命令属性,并通过事件的命令对象比较它! 问题解决了!
谢谢大家。

仅Windows XP,Windows 2003在读取参数[i]。值并显示记录集后出现“MSADO15.DLL”访问冲突错误。Windows7没有这个问题。使用WillExecute事件-它可以在任何地方正常工作。在ExecuteComplete中,您可能会从记录集中获得recordsAffected(recordsAffected变体工作错误)。如果将参数保存到变量,并在可视化组件显示记录集后读取它,您可以稍后获取参数[i]。值。例如,使用onButton单击或定时器事件。这个错误并没有在所有的Delphi版本中修复,在DelphiXE2中也是如此

问题是OneXuteComplete事件中不存在发送方!哦,我明白了。那么它必须是连接参数。不,我没有,假设您有一个没有记录集的SP,那么您调用execproc方法,如何在该事件中获取SP引用?这似乎是不可能的:(连接参数从不告诉您是什么组件触发了它。我在本机模式下工作,我尝试编写运行时跟踪器,例如,它发生错误,我需要找出发生了哪些SPs或DB事件,我从不使用该组件,我将测试,然后返回。谢谢。我看到视频,它帮不上忙,我需要profiler作为我项目的一部分。想象一下你有一个exe,它会发生一个错误,你会导致一个页面包含许多信息,比如MAD组件,但你有DB对象的跟踪,比如堆栈跟踪。例如:EXEC SP1@P1='test',@P2=120 error='Object not exists“Table1”…等等