如何使DB2的JDBC SQLExceptions更具描述性?

时间:2009-09-24 09:53:52

标签: java spring jdbc error-handling db2

如何使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框架。

3 个答案:

答案 0 :(得分:18)

将JDBC驱动程序属性retrieveMessagesFromServerOnGetMessage设置为true。连接示例网址:

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

另见DB2 11.1 Documentation

答案 1 :(得分:10)

  1. 检查异常是否实现com.ibm.db2.jcc.DB2Diagnosable

  2. DB2Diagnosable上,您可以致电getSqlca()获取DB2Sqlca。它将返回SQL错误代码(getSqlCode()),状态(getSqlState()),您可以调用getMessage()来获取格式正确且可读的错误消息。

  3. 可能有一个明智的理由说明为什么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}}方法(如果你没有使用它,那么请查看来源,看看如何它有效。)