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

Juh*_*älä 14 java db2 error-handling spring jdbc

如何使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) 
      ....
Run Code Online (Sandbox Code Playgroud)

例如,SQLSTATE 22001有这样的描述:

字符数据,右截断发生; 例如,更新或插入值是对于列太长的字符串,或者无法将日期时间值分配给主变量,因为它太小.

编辑:我也使用Spring和Hibernate框架.

and*_*ndy 20

将JDBC驱动程序属性设置retrieveMessagesFromServerOnGetMessagetrue.连接示例网址:

jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true;
Run Code Online (Sandbox Code Playgroud)

另请参见DB2 11.1文档


Aar*_*lla 10

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

  2. 在a DB2Diagnosable,你可以打电话getSqlca()来获得一个DB2Sqlca.它将返回SQL错误代码(getSqlCode()),state(getSqlState()),您可以调用getMessage()以获取格式正确且可读的错误消息.

可能有一个明智的理由为什么IBM没有将此映射到getMessage()异常.我的猜测是,他们没有,因为DB2Sqlca.getMessage()可以抛出讨厌的异常,所以你必须把它包装进去try-catch.


ska*_*man 3

Spring 包含SQLException 的翻译器,它将数据库特定的代码和状态转换为描述异常类层次结构。

它是更大的 Spring API 的一部分,但没有什么可以阻止您只使用该类。


例如,如果您有一个扩展的 DAO JdbcDaoSupport,那么您可以使用如下代码:

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

这转换并包装了SQLExceptionSpring 自己的强类型异常层次结构。

如果您不使用JdbcDaoSupport,那么您可以使用getExceptionTranslator()的方法JdbcTemplate(如果您不使用该方法,则查看源代码以了解它是如何工作的。)