Delphi ловит Async ADOQuery Exception - PullRequest
0 голосов
/ 21 марта 2019

Я открываю ADOQuery асинхронно, и он работает как положено, но любые исключения приводят к зависанию приложения. Исключение не передается обратно в основной поток.

procedure TfrmMain.actRunExecute(Sender: TObject);
begin
  ReportOpening := true;
  with myADOQuery do begin
    ExecuteOptions := [eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking];
    OnFetchProgress := ADOQueryFetchProgress;
    OnFetchComplete := ADOQueryFetchComplete;
    try
		Open;
    except
		on E: Exception do MessageDlg(E.Message, mtError, [mbOK], 0); //I expect a timeout here
    end;
  end;
end;

procedure TfrmMain.ADOQueryFetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus);
begin
  ReportOpening := false;
end;

procedure TfrmMain.ADOQueryFetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  TThread.Synchronize(nil, procedure()
	begin
		StatusBar1.Panels[1].Text := Format('Progress: %d of %d',[Progress, MaxProgress]);
    end;
    );
  Application.ProcessMessages;
end;

1 Ответ

1 голос
/ 25 марта 2019

В асинхронном режиме вы можете перехватить ошибку в обработчике события OnExecuteComplete вашего объекта TADOConnection.Вы можете использовать объекты EventStatus и Error, чтобы определить, была ли проблема.Error.Description выдаст вам ошибку, возвращенную сервером базы данных.

PS: воздержитесь от использования Application.ProcessMessages в своем коде, так как это не требуется, поскольку вы используете асинхронные запросы, и это может привести к непредвиденному событию.сценарии повторного входа.

Пример:

procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection; RecordsAffected: Integer; const Error: Error;
                                               var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset);
begin
 if EventStatus = esErrorsOccured then
  begin
   memo1.Lines.add(Error.Description);
   // recover from error here
  end;
end; 
...