奇怪的 ZQuery 行为
Strange ZQuery behavior
我在 Delphi
中使用 Zeos 和 SQLite3 数据库
ZQuery2.Close;
ZQuery2.SQL.Clear;
ZQuery2.SQL.Add('SELECT * FROM users WHERE un = ' + QuotedStr( UserName ) );
ZQuery2.Open;
OutputDebugString(PWideChar( ZQuery2.FieldDefList.CommaText )); // log : id,un,pw
OutputDebugString(PWideChar(ZQuery2.FieldByName('pw').AsString)); //causes error sometimes
代码可以正常工作,但有时我会收到以下错误消息
异常class EDatabaseError 消息'ZQuery2:Field'pw'未找到'。
这很奇怪,因为当应用程序处于 运行 中间时,数据集的一个字段不应该消失,尤其是在其他字段仍在正常运行的情况下。所以,我怀疑是内存覆盖之类的原因。
内存覆盖通常发生在将某些内容写入内存中的错误位置时,覆盖了内存中的内容,通常是因为指针值不正确或所谓的 "buffer overrun" 写入操作超出了位置是应该停止。通常,指针值错误得如此严重以至于 OS 可以检测到它并引发 AV,但有时它不太明显。
Delphi 的内存管理器有一个 'full debug mode',它为这种情况添加了特殊检查,请参阅 here。
我建议您按照链接文档启用完全调试模式并等待异常发生。
我在 Delphi
中使用 Zeos 和 SQLite3 数据库ZQuery2.Close;
ZQuery2.SQL.Clear;
ZQuery2.SQL.Add('SELECT * FROM users WHERE un = ' + QuotedStr( UserName ) );
ZQuery2.Open;
OutputDebugString(PWideChar( ZQuery2.FieldDefList.CommaText )); // log : id,un,pw
OutputDebugString(PWideChar(ZQuery2.FieldByName('pw').AsString)); //causes error sometimes
代码可以正常工作,但有时我会收到以下错误消息 异常class EDatabaseError 消息'ZQuery2:Field'pw'未找到'。
这很奇怪,因为当应用程序处于 运行 中间时,数据集的一个字段不应该消失,尤其是在其他字段仍在正常运行的情况下。所以,我怀疑是内存覆盖之类的原因。
内存覆盖通常发生在将某些内容写入内存中的错误位置时,覆盖了内存中的内容,通常是因为指针值不正确或所谓的 "buffer overrun" 写入操作超出了位置是应该停止。通常,指针值错误得如此严重以至于 OS 可以检测到它并引发 AV,但有时它不太明显。
Delphi 的内存管理器有一个 'full debug mode',它为这种情况添加了特殊检查,请参阅 here。
我建议您按照链接文档启用完全调试模式并等待异常发生。