有没有办法找到谁解雇了TADOConnection的OnExecuteComplete事件?

时间:2012-07-07 02:32:28

标签: delphi profiler tadoquery

我正在尝试在Delphi 7中编写ADO数据库分析器。 它是Delphi项目的一部分。

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

我已经研究过,并且有些版本不兼容或损坏或者版本不同......

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

我使用“Command”和“Recordset”引用来比较通过此ADOConnection链接的所有ADO对象,但是某些ADO对象没有Recordset .. 有没有办法找到谁发射该事件?喜欢Sender?

4 个答案:

答案 0 :(得分:1)

如果你在.Net中,我无法理解,但在.Net中它很容易。使用System.Diagnostics.StackTrace查看导致您的活动的整个电话。

对于本机代码,如果在调试模式下编译,可能还有一种获取堆栈跟踪的方法。自从我编写Delphi(或Pascal)代码以来已经有一段时间了。您还可以尝试使用免费AQTime standard进行性能分析,该免费call-graph适用于Delphi(本机和.Net),它也具有{{3}}功能。

答案 1 :(得分:1)

我解决了! 我写了两个来自ADOQuery和ADOStoredProc的类。 然后我发布了他们的Command属性。 通过强制将StoredProcedure转换为新类,我到命令道具并通过事件的命令对象进行比较! 问题解决了! 谢谢大家。

答案 2 :(得分:1)

只有WindowsXP,Windows 2003在读取参数[i] .Value和show recordset后出现“MSADO15.DLL”访问冲突错误。 Windows7没有这个问题。使用WillExecute事件 - 它在任何地方都可以正常工作。在ExecuteComplete中,您可能从记录集中获取记录受影响(RecordsAffected变量工作错误)。稍后如果将参数保存到Variant变量并在可视组件显示记录集后读取它,则可以获取参数[i] .Value - 使用OnButtonClick作为示例或使用Timer事件。这个BUG并没有在所有Delphi版本中修复 - 也在DelphiXE2中修复..

答案 3 :(得分:0)

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

ShowMessage((Sender as TComponent).Name);

如果Sender为nil,堆栈跟踪可能会有所帮助。

更新

显然没有Sender参数。在这种情况下,Connection必须是触发它的类,因此请获取其名称和其他数据。您可以获得足够的参数来了解正在发生的事情。