2009-09-24 32 views
13

¿Cómo hacer que las excepciones SQLE emitidas por el controlador DB2 JDBC sean más descriptivas?¿Cómo hacer que JDBC SQLExceptions para DB2 sea más descriptivo?

Actualmente recibo este tipo de excepciones. Es engorroso trabajar con estos valores numéricos crípticos SQLCODE y SQLSTATE. ¿Hay alguna manera de hacer que la excepción SQL contenga la descripción del código?

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 tiene esta descripción:

Datos de caracteres, se produjo un truncamiento correcto; por ejemplo, una actualización o un valor de inserción es una cadena que es demasiado larga para la columna, o un valor de fecha y hora no se puede asignar a una variable de host porque es demasiado pequeña.

Editar: También estoy utilizando marcos de Spring y Hibernate.

+0

Sería muy bueno para comprobar la solución de tu pregunta :-) – andy

Respuesta

3

Spring contiene translators para SQLException que convierte los códigos y estados específicos de la base de datos en una jerarquía de clase de excepción de descripción.

Es parte de Spring API más grande, pero no hay nada que te impida usar solo esa clase.


Por ejemplo, si tiene un DAO que se extiende JdbcDaoSupport, entonces puede tener un código como éste:

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

Esto se traduce y se envuelve el SQLException es propia jerarquía de excepciones establecimiento inflexible de la primavera.

Si no se está usando JdbcDaoSupport, a continuación, puede utilizar el método de JdbcTemplategetExceptionTranslator() (y si no se está usando que, a continuación, busque en la fuente para ver cómo funciona.)

10
  1. Compruebe que la excepción implementa com.ibm.db2.jcc.DB2Diagnosable

  2. en un DB2Diagnosable, puede llamar getSqlca() para obtener una DB2Sqlca. Devolverá el código de error SQL (getSqlCode()), el estado (getSqlState()) y puede llamar al getMessage() para obtener un mensaje de error formateado y legible.

es probable que haya una razón por qué inteligente de IBM no este mapa para getMessage() de la excepción. Supongo que no lo hicieron porque DB2Sqlca.getMessage() puede arrojar desagradables excepciones, por lo que debe envolverlo en try-catch.

17

Establezca la propiedad del controlador JDBC retrieveMessagesFromServerOnGetMessage en true. url ejemplo de conexión:

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

Véase también DB2 11.1 Documentation

Cuestiones relacionadas