2009-09-24 10 views
13

Come rendere più descrittive le SQLException generate dal driver JDBC DB2?Come rendere JDBC SQLExceptions per DB2 più descrittivo?

Attualmente sto ottenendo questo tipo di eccezioni. È complicato lavorare con questi valori numerici SQLCODE e SQLSTATE criptici. C'è un modo per rendere l'eccezione SQL per contenere la descrizione del codice.

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

ad es. SQLSTATE 22001 ha questa descrizione:

Dati di carattere, si è verificata la troncatura destra; ad esempio, un aggiornamento o un valore di inserimento è una stringa troppo lunga per la colonna oppure non è possibile assegnare un valore datetime a una variabile host perché è troppo piccolo.

Modifica: sto anche utilizzando i framework Spring e Hibernate.

+0

Sarebbe bello per verificare la soluzione per la tua domanda :-) – andy

risposta

3

La molla contiene translators per SQLException che converte i codici e gli stati specifici del database in una gerarchia di classi di eccezioni di descrizione.

Fa parte dell'API di Spring più grande, ma non c'è nulla che ti impedisca di usare solo quella classe.


Ad esempio, se si dispone di un DAO che si estende JdbcDaoSupport, allora si può avere codice come questo:

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

Questo si traduce e avvolge il SQLException è propria gerarchia eccezione fortemente tipizzato di primavera.

Se non si utilizza JdbcDaoSupport, quindi è possibile utilizzare il metodo di JdbcTemplategetExceptionTranslator() (e se non si sta usando questo, allora cerca nella sorgente per vedere come funziona.)

10
  1. verificare che l'eccezione implementa com.ibm.db2.jcc.DB2Diagnosable

  2. Su una DB2Diagnosable, è possibile chiamare getSqlca() per ottenere un DB2Sqlca. Restituirà il codice di errore SQL (getSqlCode()), lo stato (getSqlState()) e sarà possibile chiamare getMessage() per ottenere un messaggio di errore correttamente formattato e leggibile.

probabilmente c'è un motivo per cui intelligente IBM non ha mappare questo al getMessage() dell'eccezione. La mia ipotesi è che non lo facessero perché DB2Sqlca.getMessage() può generare brutte eccezioni, quindi è necessario avvolgerlo in try-catch.

17

Impostare la proprietà del driver JDBC retrieveMessagesFromServerOnGetMessage su true. URL di collegamento Esempio:

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

Vedi anche DB2 11.1 Documentation

Problemi correlati