4

こんにちは、いくつかの例外処理を実行して、繰り返しフィールド値 (キー違反) エラーをインターセプトしようとしています。解決策を探していたところ、すべてのエラーをトラップするための多くの提案が見られました。

try
(enter code)
except on E: EDatabaseError do
showmessage (Error message);
end; 

キー違反に具体的に対応したいのですが、ADOを使用したアクセステーブルを使用しています。

4

3 に答える 3

7

処理したい唯一のエラーが「値が重複しています」というメッセージを含むものである場合、これは機能します。

try
  // Your code
except
  on E: EOleException do
  begin
    // The better way is to find out what E.ErrorCode is
    // for this specific exception, and handle it instead
    // of checking the string - you didn't provide the
    // ErrorCode, though.
    // If E.ErrorCode = <whatever> then
    //
    if Pos('duplicate value', E.Message) > 0 then
      // You've got a duplicate with the message above
      // Do whatever handles it
    else
      raise;
  end;
  // If you want to handle other exception types (eg., EDataBaseError),
  // you can do so here:
  //  on E: EDataBaseError do
  //    HandleDBError;
end;
于 2012-04-15T20:43:26.693 に答える
6

EDatabaseError、エラーに関する追加情報を持たない単なる一般的な例外クラスです。ADO でエラーに関する拡張情報を取得するには、プロパティを使用して、例外が発生TADOConnection.Errorsしたときに特定のエラー コードを取得する必要があります。これについては、 プロパティとプロパティを確認してください。Key violationNumberNativeError

このトピックに関するその他のドキュメントはこちらにあります

于 2012-04-15T21:28:30.530 に答える
3

あなたの説明から、これは例外として取得する必要があるもののようには聞こえません。特にあなたが続けなければならないのはEOleException. 適切な処理方法がない場合は例外とする必要がありますが、ここではそうではありません。

新しいレコードを追加する前に、新しい ID がまだ使用されていないことを確認することをお勧めします。または、@TLama が示唆するように、DB フレームワークのエラー処理機能を利用して、例外になる前にこれをフックできます。

于 2012-04-15T20:48:42.633 に答える