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) 
      ....
例如,SQLSTATE 22001有这样的描述:
字符数据,右截断发生; 例如,更新或插入值是对于列太长的字符串,或者无法将日期时间值分配给主变量,因为它太小.
编辑:我也使用Spring和Hibernate框架.
and*_*ndy 20
将JDBC驱动程序属性设置retrieveMessagesFromServerOnGetMessage为true.连接示例网址:
jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true;
另请参见DB2 11.1文档
Aar*_*lla 10
检查异常是否实现 com.ibm.db2.jcc.DB2Diagnosable
在a DB2Diagnosable,你可以打电话getSqlca()来获得一个DB2Sqlca.它将返回SQL错误代码(getSqlCode()),state(getSqlState()),您可以调用getMessage()以获取格式正确且可读的错误消息.
可能有一个明智的理由为什么IBM没有将此映射到getMessage()异常.我的猜测是,他们没有,因为DB2Sqlca.getMessage()可以抛出讨厌的异常,所以你必须把它包装进去try-catch.
Spring 包含SQLException 的翻译器,它将数据库特定的代码和状态转换为描述异常类层次结构。
它是更大的 Spring API 的一部分,但没有什么可以阻止您只使用该类。
例如,如果您有一个扩展的 DAO JdbcDaoSupport,那么您可以使用如下代码:
try {
   // ... some code that throws SQLException
} catch (SQLException ex) {
   throw getExceptionTranslator().translate(null, null, ex);
}
这转换并包装了SQLExceptionSpring 自己的强类型异常层次结构。
如果您不使用JdbcDaoSupport,那么您可以使用getExceptionTranslator()的方法JdbcTemplate(如果您不使用该方法,则查看源代码以了解它是如何工作的。)
| 归档时间: | 
 | 
| 查看次数: | 8335 次 | 
| 最近记录: |