Повторно использовать ADOQuery после отмены - PullRequest
4 голосов
/ 01 ноября 2019

Я использую асинхронные запросы ADO в своем приложении Delphi 2010. Пользователь может запросить отмену запроса, или он может потерпеть неудачу из-за ошибки. Это код, который я использую для отмены запроса:

if not Assigned(myADOQuery.Recordset) then exit;
if stFetching in myADOQuery.RecordsetState then begin
  fCommand := _Command(myADOQuery.Recordset.ActiveCommand);
  fCommand.Cancel;
  if Assigned(myADOQuery.Recordset) then myADOQuery.Recordset.Cancel;
end;
if Assigned(myADOQuery.Recordset) then myADOQuery.Recordset.Cancel;
StatusBar1.Panels[2].Text := '';
//ShowMessage('Query Cancelled');
myADOQuery.Close;

Я использую ADOConnection ExecuteComplete, чтобы показать пользователю отмену (или другую ошибку):

if EventStatus = esErrorsOccured then ShowMessage(Error.Description);

IТеперь я хочу иметь возможность повторно использовать запрос после того, как он был изменен, но при повторном запуске я получаю то же сообщение об ошибке. Есть ли способ сбросить запрос (включая SQL.Text) и запустить его снова?

NiMuSi

1 Ответ

5 голосов
/ 01 ноября 2019

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

AdoConnection имеет коллекцию Errors, в которой записываются сведения о каждой происходящей ошибке ADO. Iirc, эта коллекция накапливается как объекты, использующие ошибки выполнения AdoConnection, пока вы не вызовете Clear в интерфейсе Errors. Возможно, отмена выполнения запроса вызывает ошибку при следующем его выполнении.

Итак, попробуйте следующее, прежде чем пытаться повторно использовать AdoQuery:

myAdoQuery.Connection.Errors.Clear;

и сообщите нам об этом. как вы ладите.

Кроме того, на вашем месте я бы проверил, что RecordSet в AdoQuery равен NIL, прежде чем пытаться открыть его заново, и явно установить его в NIL в конце процедуры отмены. На всякий случай ...

...