2012-04-15 14 views
3

私はいくつかの例外処理を行い、繰り返しフィールド値(キー違反)エラーを傍受しようとしています。トラップに多くの示唆を見ソリューションアイブのための私の検索から、すべてのエラーがトラップキー違反

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

を使用しますが、私はキー違反に特異的に対応したいと思い、それはADOを使用してアクセステーブルを使用しています。

+1

をこのトピックの詳細ドキュメントを見つけたことができますか? –

+0

すでに存在し、次のメッセージが返されるクライアントID(主キー)を持つ新しいクライアントをシステムに追加すると、例外クラスEOleExceptionが発生しました。 'テーブルに要求した変更は成功しませんでした。主キー、または関係 ' – Alexjjsmith

+0

に重複する値を作成すると、同じメッセージが返されたが、EOleExceptionの代わりにEDatabaseErrorが返された場合 – Alexjjsmith

答えて

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; 
+0

英語以外のシステムでローカリゼーションが失敗する可能性はありますか?ちょっとした考え!また、コードはすべてのEOleException例外を呑み込んでいます。 –

+0

この問題が発生しない優れたソリューションを提供するために私の答えを更新しました。 'Pos'行の上のコメントを見てください。 :) –

+0

どうすればエラーコードを見つけることができますか? – Alexjjsmith

3

、これは何かのような音はありません、あなたがすべき例外的なところまで行きましょう。特に続ける必要があるのは、EOleExceptionです。例外は、あなたが扱う良い方法を持っていない物でなければなりません。そして、それはここではそうではありません。

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

+0

@kenトランザクションは2と取引し、あなたは約1のポイントを持っています。おそらく、perfはあまりにも大きな問題です。私はDB側の視点ではなくプログラミング側から考えています。 –

+0

しかし、これはおそらくDBデータ提供制御イベントの一部で*捕らえられる*かもしれません。 – TLama

+0

@traama、どこに捕まえても問題ありません。それはまだ捕らえられなければならない。 –

6

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

あなたは、特にあなたがトラップしたい例外を識別何ここ