2009-09-09 15 views
14

SQLException.getSQLState récupère le SQLState pour l'objet SQLException. Quelles sont toutes les valeurs possibles qui peuvent être retournées par cette méthode? Puis-je utiliser la valeur pour identifier les erreurs spécifiques qui se sont produites dans la base de données (par exemple, cette valeur peut-elle me dire s'il s'agit d'une violation de PK, d'une contrainte unique ou d'une valeur de colonne)?Quelles sont toutes les valeurs possibles pour SQLException.getSQLState?

En outre, la méthode DatabaseMetaData.getSQLStateType() est censée indiquer si le SQLSTATE retourné par SQLException.getSQLState est X/Open (maintenant appelé Open Group) SQL CLI ou SQL99. La seule valeur possible pour ceci devrait être DatabaseMetaData.sqlStateXOpen == 1 et DatabaseMetaData.sqlStateSQL99 == 2 mais j'obtiens la valeur 0. Est-ce que je manque quelque chose?

Y a-t-il un moyen de déterminer le type spécifique d'erreur qui s'est produit dans la base de données en utilisant des combinaisons des méthodes mentionnées ci-dessus? Puis-je compter sur les valeurs de SQLException.getSQLState? Ces valeurs sont-elles différentes du fournisseur de base de données au fournisseur de base de données?

+0

[Voir aussi cette réponse] (http://stackoverflow.com/a/1989469/521799) –

Répondre

2

Les documents officiels qui incluent SQLStates peuvent évidemment être achetés, à un prix relativement élevé, à partir de ANSI et XOpen. Cependant, la documentation de la plupart des bases de données contient des listes d'états SQL. Les listes en ligne les plus complètes (et les plus accessibles) figurent probablement dans les manuels DB2. Vérifiez le DB2 Universal Messages manual, par exemple. Oracle (mot de passe TechNet requis) et Sybase, entre autres, ont également des listes en ligne. En ce qui concerne la deuxième question, c'est l'intention de SQLState, cependant, les différentes bases de données ont des degrés variables de conformité. Par exemple, certains mappent plusieurs messages d'erreur natifs au même état SQL. Pour une utilisation générique, on devrait probablement se concentrer sur le code majeur (les deux premiers caractères de SQLState,) déterminer alors si les informations plus spécifiques est disponible dans le code mineur (au-delà de 000.)

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

1

Cela dépend dans une certaine mesure du pilote JDBC. Il semble y avoir des valeurs standard, plus quelques valeurs propriétaires.

Pour vous guider dans ce qui est possible, la couche JDBC de Spring inclut le code d'erreur SQL et la traduction d'état. Il fournit un SQLState translator qui donne une traduction d'exception plutôt vague, ainsi qu'un SQLErrorCode translator qui est beaucoup plus précis, en utilisant des codes d'erreur propriétaires connus.

Si vous ne pouvez pas utiliser Spring, téléchargez le code source et extrayez le fichier sql-error-codes.xml, qui contient le mappage des codes aux types d'exception.

2

Les normes X/Open (maintenant Open Group) sont maintenant disponibles gratuitement (mais l'inscription est obligatoire). Voir Data Management: SQL Call Level Interface (CLI) pour la norme SQL CLI (aka ODBC), les codes SQLSTATE sont définis dans l'annexe A. Et Data Management: Structured Query Language (SQL), Version 2 pour la norme SQL, les codes SQLSTATE sont définis dans l'annexe B. Quant aux normes ISO, alors que vous devez payer pour les versions officielles , les versions finales (qui sont presque identiques) sont librement disponibles; pour SQL: 2011, voir page 2017 (par numérotation PDF, 1194 par numérotation de page de document) de Final Committee Draft ISO/IEC FCD 9075-2

Questions connexes