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驱动程序属性设置retrieveMessagesFromServerOnGetMessage
为true
.连接示例网址:
jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true;
Run Code Online (Sandbox Code Playgroud)
另请参见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);
}
Run Code Online (Sandbox Code Playgroud)
这转换并包装了SQLException
Spring 自己的强类型异常层次结构。
如果您不使用JdbcDaoSupport
,那么您可以使用getExceptionTranslator()
的方法JdbcTemplate
(如果您不使用该方法,则查看源代码以了解它是如何工作的。)
归档时间: |
|
查看次数: |
8335 次 |
最近记录: |