Ответ 1
Задайте для свойства драйвера JDBC retrieveMessagesFromServerOnGetMessage
значение true
. Пример URL-адреса соединения:
jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true;
См. также Документация DB2 11.1
Как сделать 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.
Задайте для свойства драйвера JDBC retrieveMessagesFromServerOnGetMessage
значение true
. Пример URL-адреса соединения:
jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true;
См. также Документация DB2 11.1
Убедитесь, что исключение реализует com.ibm.db2.jcc.DB2Diagnosable
На DB2Diagnosable
вы можете вызвать getSqlca()
, чтобы получить DB2Sqlca
. Он вернет код ошибки SQL (getSqlCode()
), состояние (getSqlState()
), и вы можете вызвать getMessage()
, чтобы получить правильно отформатированное и читаемое сообщение об ошибке.
Вероятно, есть разумная причина, по которой IBM не сопоставляла это с getMessage()
исключения. Я предполагаю, что они не потому, что DB2Sqlca.getMessage()
могут вызывать неприятные исключения, поэтому вы должны обернуть его в try-catch
.
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
(и если вы не используете его, посмотрите на источник, чтобы узнать, как он работает.)