1

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

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

我研究并理解了一些win版本不兼容或损坏或有不同的版本..

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

我使用“命令”和“记录集”引用来比较通过此 ADOConnection 链接的所有 ADO 对象,但某些 ADO 对象没有记录集。有没有办法找到触发该事件的人?像发件人?

4

4 回答 4

1

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

于 2012-08-18T19:55:55.117 回答
1

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

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

于 2012-07-07T16:09:51.047 回答
1

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

于 2012-07-07T22:17:25.607 回答
0

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

ShowMessage((Sender as TComponent).Name);

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

更新

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

于 2012-07-07T03:30:21.680 回答