【问题标题】:is there a way to find who fired OnExecuteComplete event of TADOConnection?有没有办法找到谁触发了 TADOConnection 的 OnExecuteComplete 事件?
【发布时间】:2012-07-07 02:32:27
【问题描述】:

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

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

我研究并了解某些win版本不兼容或损坏或版本不同..

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

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

【问题讨论】:

    标签: delphi profiler tadoquery


    【解决方案1】:

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

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

    【讨论】:

    • 我在本地模式下工作,我尝试编写运行时跟踪器,例如,它发生错误,我需要找出发生的 SP 或 DB 事件,我从不使用该组件,我将测试并返回。谢谢。
    • 我看视频,它无济于事,我需要探查器作为我项目的一部分。假设您有一个 exe,它发生错误,您导致页面包含许多信息,例如 MAD 组件,但您有 DB 对象的跟踪,例如堆栈跟踪。例如:EXEC SP1 @P1='test', @P2 = 120 error = 'Object not exists "Table1"' .. etc
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        ShowMessage((Sender as TComponent).Name);
        

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

        更新

        显然没有 Sender 参数。在这种情况下,Connection 必须是触发它的类,因此获取它的名称和其他数据。你得到足够的参数来找出发生了什么。

        【讨论】:

        • 问题是在 OnExexuteComplete 事件中 Sender 不存在!
        • 哦,确实,我明白了。那么一定是Connection参数。
        • 不,我没有,假设你有一个没有记录集的 SP,那么你调用 execproc 方法,在那种情况下如何获得 SP 引用?似乎不可能:(
        • 连接参数永远不会告诉你是什么组件触发它。
        猜你喜欢
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        相关资源
        最近更新 更多