如何使DB2 JDBC驱动程序抛出的SQLExceptions更具描述性?
目前我遇到了这种例外情况。使用这些神秘的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)
....
e.g。 SQLSTATE 22001有这样的描述:
字符数据,发生右截断;例如,更新或插入值是对于列太长的字符串,或者无法将日期时间值分配给主变量,因为它太小。
编辑:我也在使用Spring和Hibernate框架。
答案 0 :(得分:18)
将JDBC驱动程序属性retrieveMessagesFromServerOnGetMessage
设置为true
。连接示例网址:
jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true;
答案 1 :(得分:10)
检查异常是否实现com.ibm.db2.jcc.DB2Diagnosable
在DB2Diagnosable
上,您可以致电getSqlca()
获取DB2Sqlca
。它将返回SQL错误代码(getSqlCode()
),状态(getSqlState()
),您可以调用getMessage()
来获取格式正确且可读的错误消息。
可能有一个明智的理由说明为什么IBM没有将此映射到异常的getMessage()
。我的猜测是他们没有,因为DB2Sqlca.getMessage()
会抛出讨厌的异常,所以你必须把它包装在try-catch
中。
答案 2 :(得分:3)
Spring包含translators用于SQLException,它将特定于数据库的代码和状态转换为描述异常类层次结构。
它是更大的Spring API的一部分,但没有什么能阻止你使用这个类。
例如,如果您有一个扩展JdbcDaoSupport
的DAO,那么您可以使用以下代码:
try {
// ... some code that throws SQLException
} catch (SQLException ex) {
throw getExceptionTranslator().translate(null, null, ex);
}
这将翻译并包装SQLException
是Spring自己的强类型异常层次结构。
如果你没有使用JdbcDaoSupport
,那么你可以使用getExceptionTranslator()
的{{1}}方法(如果你没有使用它,那么请查看来源,看看如何它有效。)