2009-09-24 19 views
13

DB2 JDBCドライバによってスローされるSQLExceptionをよりわかりやすいものにするには?DB2のJDBC SQLExceptionsをよりわかりやすくするには?

現在、この種の例外が発生しています。これらの暗黙のSQLCODEおよびSQLSTATE数値で作業するのは面倒です。コードの説明を含むSQL例外を作成する方法はありますか?

Caused by: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -302, 
    SQLSTATE: 22001, SQLERRMC: null 
     at com.ibm.db2.jcc.b.hh.c(hh.java:1662) 
     at com.ibm.db2.jcc.b.hh.a(hh.java:1238) 
     at com.ibm.db2.jcc.c.db.n(db.java:737) 
     .... 

SQLSTATE 22001の説明は次のとおりです。

文字データ、右切り捨てが発生しました。たとえば、更新または挿入の値が列に対して長すぎる文字列であるか、ホスト変数にdatetime値を割り当てることができない場合は、その値が小さすぎるためです。

編集:SpringとHibernateのフレームワークも使用しています。

+0

:-)あなたの質問のためのソリューションをチェックするために素晴らしいことです – andy

答えて

3

スプリングには、データベース固有のコードと状態を説明例外クラス階層に変換するSQLExceptionのためのtranslatorsが含まれています。

これは大きなSpring APIに含まれていますが、そのクラスだけを使用することを妨げるものは何もありません。


たとえば、あなたがJdbcDaoSupportを拡張するDAOを持っている場合、あなたは、このようなコードを持つことができます。

これは翻訳と SQLExceptionをラップ
try { 
    // ... some code that throws SQLException 
} catch (SQLException ex) { 
    throw getExceptionTranslator().translate(null, null, ex); 
} 

は春の独自の強く型付けされた例外階層です。

あなたは、あなたがJdbcTemplategetExceptionTranslator()方法を使用することができ、JdbcDaoSupportを使用していない場合は(そしてあなたはそれがどのように動作するかを確認するために、ソースを見て、ことを使用していない場合。)

10
  1. 例外はDB2Diagnosablecom.ibm.db2.jcc.DB2Diagnosable

  2. を実装していることを確認し、あなたはDB2Sqlcaを取得するためにgetSqlca()を呼び出すことができます。 SQLエラーコード(getSqlCode())、状態(getSqlState())が返され、getMessage()を呼び出して、適切にフォーマットされて読み取り可能なエラーメッセージが表示されます。

IBMがこれを例外のgetMessage()にマップしなかった理由は多分あります。私の推測では、DB2Sqlca.getMessage()は厄介な例外をスローすることができるので、それらはしなかったので、try-catchにそれをラップする必要があります。

17

retrieveMessagesFromServerOnGetMessagetrueに設定します。例接続URL:

jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true; 

も参照してくださいDB2 11.1 Documentation

関連する問題