Как сделать JDBC SQLExceptions для DB2 более наглядным?

Как сделать SQLExceptions, созданный драйвером DB2 JDBC более описательным?

В настоящее время я получаю такие исключения. Это громоздко работать с этими криптоваными значениями 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 имеет это описание:

Символьные данные, произошло правильное усечение; например, значение update или insert является строкой, которая слишком длинна для столбца, или значение datetime не может быть назначено переменной хоста, поскольку оно слишком мало.

Изменить: Я также использую рамки Spring и Hibernate.

Ответы

Ответ 1

Задайте для свойства драйвера JDBC retrieveMessagesFromServerOnGetMessage значение true. Пример URL-адреса соединения:

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

См. также Документация DB2 11.1

Ответ 2

  • Убедитесь, что исключение реализует com.ibm.db2.jcc.DB2Diagnosable

  • На DB2Diagnosable вы можете вызвать getSqlca(), чтобы получить DB2Sqlca. Он вернет код ошибки SQL (getSqlCode()), состояние (getSqlState()), и вы можете вызвать getMessage(), чтобы получить правильно отформатированное и читаемое сообщение об ошибке.

Вероятно, есть разумная причина, по которой IBM не сопоставляла это с getMessage() исключения. Я предполагаю, что они не потому, что DB2Sqlca.getMessage() могут вызывать неприятные исключения, поэтому вы должны обернуть его в try-catch.

Ответ 3

Spring содержит переводчики для SQLException, которые преобразуют коды и состояния, специфичные для базы данных, в иерархию классов описания описания.

Это часть более крупного API Spring, но там ничего не мешает вам использовать только этот класс.


Например, если у вас есть DAO, который расширяет JdbcDaoSupport, тогда у вас может быть такой код:

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

Это преобразует и обертывает SQLException Spring собственную строго типизированную иерархию исключений.

Если вы не используете JdbcDaoSupport, вы можете использовать метод getExceptionTranslator() JdbcTemplate (и если вы не используете его, посмотрите на источник, чтобы узнать, как он работает.)