我在Delphi 中使用Zeos和SQLite3 DB
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
代码正在工作,但有时我会收到以下错误消息异常类EDatabaseError,消息为"ZQuery2:Field'pw'未找到">
这很奇怪,因为数据集的字段不应该在应用程序运行过程中消失,尤其是在其他字段仍正常运行的情况下。所以,我怀疑像内存覆盖这样的东西是原因。
内存覆盖通常发生在将某些内容写入内存中错误的位置时,覆盖了现有内容,通常是因为指针值不正确或所谓的"缓冲区溢出",写入操作在应该停止的位置之外继续。通常,指针值是如此错误,以至于操作系统可以检测到它并引发AV,但有时它不太明显。
Delphi的内存管理器有一个"完全调试模式",它为这种情况添加了特殊检查,请参阅此处。
我建议您根据链接的文档启用完全调试模式,然后等待异常发生。