2009-09-24 4 views
13

Comment rendre SQLExceptions levées par le pilote DB2 JDBC plus descriptif?Comment rendre JDBC SQLExceptions pour DB2 plus descriptif?

Actuellement, je reçois ce genre d'exceptions. Il est fastidieux de travailler avec ces valeurs numériques cryptées SQLCODE et SQLSTATE. Existe-t-il un moyen de faire en sorte que l'exception SQL contienne une description de code?

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) 
     .... 

par exemple. SQLSTATE 22001 a cette description:

Données de caractère, la troncature droite s'est produite; par exemple, une valeur de mise à jour ou d'insertion est une chaîne trop longue pour la colonne, ou une valeur de date/heure ne peut pas être affectée à une variable hôte, car elle est trop petite.

Éditer: J'utilise aussi les frameworks Spring et Hibernate.

+0

Il serait bon de vérifier la solution pour votre question :-) – andy

Répondre

3

Le ressort contient translators pour SQLException qui convertit les codes et les états spécifiques à la base de données en une hiérarchie de classe d'exception de description.

Cela fait partie de l'API Spring, mais rien ne vous empêche d'utiliser cette classe.


Par exemple, si vous avez un OAC qui étend JdbcDaoSupport, alors vous pouvez avoir le code comme ceci:

try { 
    // ... some code that throws SQLException 
} catch (SQLException ex) { 
    throw getExceptionTranslator().translate(null, null, ex); 
} 

Cela se traduit et enveloppe le SQLException est propre hiérarchie d'exception fortement typé de printemps.

Si vous ne l'utilisez JdbcDaoSupport, vous pouvez utiliser la méthode getExceptionTranslator() de JdbcTemplate (et si vous ne l'utilisez que, puis regardez à la source pour voir comment cela fonctionne.)

10
  1. Vérifiez que l'exception implémente com.ibm.db2.jcc.DB2Diagnosable

  2. Sur un DB2Diagnosable, vous pouvez appeler pour obtenir un getSqlca()DB2Sqlca. Il renverra le code d'erreur SQL (getSqlCode()), l'état (getSqlState()) et vous pouvez appeler getMessage() pour obtenir un message d'erreur correctement formaté et lisible.

Il y a probablement une raison intelligente pourquoi IBM n'a pas la carte à cette getMessage() de l'exception. Ma conjecture est qu'ils ne l'ont pas parce que DB2Sqlca.getMessage() peut jeter des exceptions désagréables, de sorte que vous devez l'envelopper dans try-catch.

17

Définissez la propriété du pilote JDBC retrieveMessagesFromServerOnGetMessage sur true. Exemple connexion url:

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

Voir aussi DB2 11.1 Documentation

Questions connexes