Delphi BDE 连接到 Oracle 访问冲突

问题描述 投票:0回答:1

我正在寻找大型旧产品中的错误。最终用户仅报告程序崩溃(没有错误消息)。 当我使用附加的调试器启动程序时,我得到这个:

Im Projekt XXXXX.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x00000000: read of address 0x00000000' aufgetreten.

当我查看堆栈跟踪时,错误发生在这里:

procedure TQuery.FreeStatement;
var
  Result: DbiResult;
begin
  if StmtHandle <> nil then
  begin
    Result := DbiQFree(FStmtHandle);
    if not (csDestroying in ComponentState) then
      Check(Result);
  end;
end;

AV 发生在

Result := DbiQFree(FStmtHandle);
线上。

它是由调用

TQuery.Close
触发的。 所讨论的
TQuery
对象用于
Select
语句。 我无法弄清楚 nil 指针所在的位置。 我已经使用 FastMM4 和 FullDebugMode 来查找 free 或其他东西后是否有任何用途。但 FastMM4 不会报告任何错误。 我还重新编译了启用 madExcept 的项目,但 madExcept 也无法捕获错误(当没有连接调试器时程序会直接关闭)。

我将 OnDisconnect 和 OnConnect 事件处理程序附加到

TDatabase
对象。发生错误时,根据事件,连接并未断开。

有人知道错误在哪里吗?此外,任何有助于接近潜在错误代码片段的软件或调试技巧都是有帮助的;-)

delphi delphi-xe7 bde
1个回答
0
投票

TQuery 对象在 Close 调用之前执行的 SQL 语句是一个

Select * ...
语句。查询返回几个列,其中之一是 RAW 又名 BLOB 列。专栏的内容可能太大而无法处理。查看代码并检查根本没有使用原始列数据后,查询仅用于检查表中是否有数据。我将查询更改为
Select 1 ...
问题已解决。所以,对于每个人都有同样奇怪的错误。检查 RAW 列的结果数据集。即使返回的行在给定的列中具有 NULL 值。

© www.soinside.com 2019 - 2024. All rights reserved.