2009-09-24 9 views
13

Jak bardziej opisowy sposób renderowania SQLExceptions przez sterownik JDBC DB2?Jak uczynić JDBC SQLExceptions dla DB2 bardziej opisowym?

Obecnie otrzymuję tego rodzaju wyjątki. Praca z tymi tajemniczymi wartościami liczbowymi SQLCODE i SQLSTATE jest kłopotliwa. Czy istnieje sposób, aby wyjątek SQL zawierał opis kodu.

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

np. SQLSTATE 22001 ma następujący opis:

Dane znakowe, wystąpiło prawidłowe obcięcie; na przykład aktualizacja lub wartość wstawienia to ciąg zbyt długi dla kolumny lub wartość datetime nie może zostać przypisana do zmiennej języka macierzystego, ponieważ jest zbyt mała.

Edycja: Używam także frameworków Spring i Hibernate.

+0

Byłoby wspaniale, aby sprawdzić rozwiązanie dla Twojego pytania :-) – andy

Odpowiedz

3

Wiosna zawiera translators dla SQLException, który konwertuje kody i stany specyficzne dla bazy danych do hierarchii klas wyjątków opisu.

Jest to część większego Spring API, ale nic nie powstrzyma cię przed używaniem tej klasy.


Na przykład, jeśli masz DAO, która rozciąga JdbcDaoSupport, wtedy można mieć kod jak poniżej:

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

To przekłada i zawija SQLException jest silnie wpisany własnej hierarchii wyjątek sprężyny.

Jeśli nie używasz JdbcDaoSupport, można zastosować metodę JdbcTemplategetExceptionTranslator() (a jeśli nie używasz, wtedy szukać u źródła, aby zobaczyć jak to działa.)

10
  1. sprawdź, czy wyjątek wdraża com.ibm.db2.jcc.DB2Diagnosable

  2. na DB2Diagnosable można nazwać getSqlca() dostać DB2Sqlca. Zwróci kod błędu SQL (getSqlCode()), stan (getSqlState()) i można zadzwonić pod numer getMessage(), aby uzyskać poprawnie sformatowany i czytelny komunikat o błędzie.

Istnieje prawdopodobnie dobry powód, dla którego IBM nie zamapował tego na getMessage() wyjątku. Domyślam się, że nie, ponieważ DB2Sqlca.getMessage() może rzucać nieprzyjemne wyjątki, więc musisz go zawinąć w try-catch.

17

Ustaw właściwość sterownika JDBC retrieveMessagesFromServerOnGetMessage na true. url przykład gra:

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

Zobacz również DB2 11.1 Documentation