2009-09-09 12 views
14

SQLException.getSQLState recupera el SQLState para el objeto SQLException. ¿Cuáles son todos los valores posibles que puede devolver este método? ¿Puedo usar el valor para identificar errores específicos ocurridos en la base de datos (es decir, puede este valor decirme si fue una violación de PK, o una restricción única, o un valor de columna a grande, etc.)?¿Cuáles son todos los valores posibles para SQLException.getSQLState?

Además, se supone que el método DatabaseMetaData.getSQLStateType() indica si el SQLSTATE devuelto por SQLException.getSQLState es X/Open (ahora conocido como Open Group) SQL CLI o SQL99. El único valor posible para esto debería ser DatabaseMetaData.sqlStateXOpen == 1 y DatabaseMetaData.sqlStateSQL99 == 2 pero obtengo el valor 0. ¿Me estoy perdiendo de algo?

¿Hay alguna manera de poder determinar el tipo específico de error que ocurrió en el DB usando combinaciones de los métodos mencionados anteriormente? ¿Puedo contar con los valores de SQLException.getSQLState? ¿Son estos valores diferentes del proveedor de DB al proveedor de DB?

+0

[Vea también esta respuesta] (http://stackoverflow.com/a/1989469/521799) –

Respuesta

2

Obviamente, se pueden comprar documentos oficiales que incluyen SQLStates, a un precio relativamente alto, de ANSI y XOpen. Pero, la documentación para la mayoría de las bases de datos tiene listas de SQLStates. Probablemente, los listados en línea más completos (y accesibles) estén en los manuales de DB2. Compruebe el DB2 Universal Messages manual, por ejemplo. Oracle (se requiere contraseña de TechNet) y Sybase, entre otros, también tienen listados en línea.

En cuanto a la segunda pregunta, esta es la intención de SQLState, sin embargo, las diversas bases de datos tienen diferentes grados de cumplimiento. Por ejemplo, algunos mapean múltiples mensajes de error nativos en el mismo SQLState. Para uso genérico, probablemente uno debería concentrarse en el código principal (los dos primeros caracteres del Sqlstate,) luego determinar si más información específica está disponible en el código secundario (más allá de 000.)

http://www.jguru.com/faq/view.jsp?EID=46397

1

Hasta cierto punto depende del controlador JDBC. Parece que hay valores estándar, más algunos valores propietarios.

Como una guía de lo que es posible, la capa JDBC de Spring incluye el código de error SQL y la traducción del estado. Proporciona un SQLState translator que proporciona una traducción de excepción bastante vaga, así como un SQLErrorCode translator que es mucho más refinado, utilizando códigos de error patentados conocidos.

Si no puede usar Spring, descargue el código fuente y extraiga el archivo sql-error-codes.xml, que contiene la asignación de códigos a tipos de excepción.

2

Los estándares X/Open (ahora Open Group) ya están disponibles de forma gratuita (pero es necesario registrarse). Ver Data Management: SQL Call Level Interface (CLI) para el estándar SQL CLI (aka ODBC), los códigos SQLSTATE se definen en el Apéndice A. Y Data Management: Structured Query Language (SQL), Version 2 para el estándar SQL, los códigos SQLSTATE se definen en el Apéndice B. En cuanto a los estándares ISO, mientras que usted tiene que pagar por las versiones oficiales , los borradores finales (que son casi idénticos) están disponibles gratuitamente; para SQL: 2011, consulte la página 2017 (por numeración PDF; 1194 por numeración de páginas de documentos) de Final Committee Draft ISO/IEC FCD 9075-2

Cuestiones relacionadas