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 に答える