【问题标题】:How to make JDBC SQLExceptions for DB2 more descriptive?如何使 DB2 的 JDBC SQLExceptions 更具描述性?
【发布时间】:2010-12-01 00:58:56
【问题描述】:

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

【问题讨论】:

  • 很高兴检查您的问题的解决方案 :-)

标签: java spring jdbc error-handling db2


【解决方案1】:

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

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

另见DB2 11.1 Documentation

【讨论】:

  • 太棒了。拯救了我的一天!
  • 这也适用于更老的 DB2。不要忘记“;”最后。
【解决方案2】:
  1. 检查异常是否实现com.ibm.db2.jcc.DB2Diagnosable

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

IBM 没有将其映射到异常的getMessage() 可能有一个聪明的原因。我的猜测是他们没有这样做,因为DB2Sqlca.getMessage() 会抛出令人讨厌的异常,因此您必须将其包装在try-catch 中。

【讨论】:

    【解决方案3】:

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

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


    例如,如果你有一个扩展 JdbcDaoSupport 的 DAO,那么你可以有这样的代码:

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

    这会转换和包装 SQLException 是 Spring 自己的强类型异常层次结构。

    如果您没有使用JdbcDaoSupport,那么您可以使用JdbcTemplategetExceptionTranslator() 方法(如果您没有使用它,请查看源代码以了解其工作原理。)

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      相关资源
      最近更新 更多