2012-04-19 27 views
0

私はデータベースに接続されたアプリケーションを持っています。
BDEコンポーネントを使用して接続し、データベースはMySQLです。Delphiが例外の特定の原因を見つける

今、私は、挿入ステートメントが実行されている間に重複したエントリがあるかどうかを確認するためにいくつかのバリデーションを行っています。

以下は、主キー属性のエントリが重複しているかどうかを確認するコードです。誰も私を伝えることができ

var 
    error :string; 
    cmpres:integer; 
begin 
... 
/* all my data queries */ 
    try 
    Query1.ExecSQL; 
    Except 
    on E: Exception do 
    /*check if its a Duplicate entry or other exception*/ 
    begin  
     error := E.Message; 
     error := copy(error,length(error)-16,length(error)-2); 
     cmpres :=CompareStr(LowerCase(error),'for key '+#39+'primary'+#39) ; 
     if cmpres = 0 then 
      MessageDlg('Entry already exist',mtError,[mbok],0) 
     else 
      MessageDlg('Invalid Data Entries',mtError,[mbok],0); 
     exit; 
    end; 
    end; 
end; 

データベース例外が広くEDatabaseError

の内側に入れて、私はメッセージの比較を行うことなく、これらのエラーを区別することができますどのような方法があります。
ありがとうございます。

+0

デバッガはあなたに何を伝えますか? –

+0

@DavidHeffernanデバッガが私にこのエラーメッセージを表示しています 'エラー'キー違反 '#$ D#$ A' [MySQL 5.1.5] [mysqld-5.5.11] PRIMARY '' '' ' – Shirish11

+0

いいえ、** class **はエラーで、そのクラスが提供するプロパティは何ですか。 –

答えて

1

BDEを使用している場合、例外はEDatabaseErrorではなくEDBEngineErrorにする必要があります。あなたはこれを行うことができます:

try 
    Query1.ExecSQL; 
except 
    on E: EDBEngineError do 
    begin 
     for i := 0 to E.ErrorCount - 1 do 
     begin 
      err := E.Errors[i]; 
      case err.ErrorCode of 
       ... stuff ... 
      end; 
     end 
    end; 
end 
+0

これは他のDBコンポーネントとデータベースに適用できますか? – Shirish11

+0

そのように見えます。あなたは(EがEDBEngineErrorなら)して、かなり簡単にチェックできるはずです... – JamesT