2

我刚刚通过将表和查询替换为 ADO 组件中的等效项,从使用 BDE 切换到 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 代码中回答。

4

1 回答 1

3

您应该首先检查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;
于 2014-02-19T16:53:55.247 回答