Странное поведение ZQuery - PullRequest
       37

Странное поведение ZQuery

1 голос
/ 25 февраля 2020

Я использую Zeos и SQLite3 DB в Delphi

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 'не найден'.

1 Ответ

1 голос
/ 25 февраля 2020

Это странно, потому что поле набора данных не должно просто исчезать, когда приложение находится в середине работы, особенно если другие поля все еще работают нормально. Итак, я подозреваю, что причиной является что-то вроде перезаписи памяти.

Перезаписи памяти обычно происходят, когда что-то записывается в неправильное место в памяти, перезаписывая то, что есть, обычно из-за неверного значения указателя или называемый "переполнением буфера", когда операция записи продолжается после того, где должна быть остановлена. Обычно значение указателя настолько сильно неверно, что ОС может его обнаружить и поднять AV, но иногда оно менее очевидно.

Delphi диспетчер памяти имеет «полный режим отладки», который добавляет специальные проверки для этого условия, см. здесь .

Я предлагаю вам включить режим полной отладки в соответствии со связанным документом и дождаться возникновения исключения.

...