ADO Обработка исключений?

Я только что перешел от использования BDE к ADO, заменив таблицы и запросы на их эквиваленты в компонентах ADO.

Я всегда выполняю запрос внутри try... catch так:

//Fdm is Data Module
//TEndOfDay is TTable
//QEndOfDay is TQuery

Screen->Cursor = crSQLWait;
Fdm->QEndOfDay->SQL->Add("SELECT * FROM TEndOfDay");
try{
  Fdm->QEndOfDay->ExecSQL();
  Fdm->QEndOfDay->Open();
  Screen->Cursor = crDefault;
}
catch (EDBEngineError &DBEngineError){
  strError = DBEngineError.Message;
  Screen->Cursor = crDefault;
}
catch (EDatabaseError &DatabaseError){
  strError = DatabaseError.Message;
  Screen->Cursor = crDefault;
}
catch(...){
  strError = "Error";
  Screen->Cursor = crDefault;
}          

Поскольку я перешел на ADO, применимы ли эти исключения (DBEngineError, DatabaseError)?

Я отредактировал свой пост, чтобы включить людей Delphi, они быстро отвечают. Неважно, если ответ в Delphi код.

1 ответ

Решение

Вы должны сначала проверить EADOError, которые являются конкретными исключениями, связанными с ADO, а затем EDatabaseError, которые являются более общими исключениями базы данных. EDBEngineError является старым классом исключений BDE и больше не применяется, если вы не используете BDE.

Screen.Cursor := crSQLWait;
Fdm.QEndOfDay.SQL.Text := 'SELECT * FROM TEndOfDay';
try
  try
    Fdm.QEndOfDay.Open;
  except
    on E: EAdoError do
    begin
      // ADO specific error handling
    end;
    on E: EDatabaseError do
    begin
      // Generic database error handling
    end;
    on E: Exception do
    begin
      // Other exceptions (non-DB related)
    end;
  end;
finally
  // Revert cursor to default always.
  Screen.Cursor := crDefault;
end;
Другие вопросы по тегам