2009-09-09 24 views
14

SQLException.getSQLState recupera lo SQLState per l'oggetto SQLException. Quali sono tutti i possibili valori che possono essere restituiti con questo metodo? Posso usare il valore per identificare errori specifici che si sono verificati nel database (cioè questo valore può dirmi se si trattava di una violazione PK, o di un vincolo univoco, o di un valore di colonna elevato, ecc.)?Quali sono tutti i valori possibili per SQLException.getSQLState?

Inoltre, il metodo DatabaseMetaData.getSQLStateType() dovrebbe indicare se il SQLSTATE restituito da SQLException.getSQLState è X/Open (ora noto come Open Group) SQL CLI o SQL99. L'unico valore possibile per questo dovrebbe essere DatabaseMetaData.sqlStateXOpen == 1 e DatabaseMetaData.sqlStateSQL99 == 2 ma sto ottenendo il valore 0. Mi sto perdendo qualcosa?

Esiste un modo per determinare il tipo specifico di errore che si è verificato nel DB utilizzando combinazioni dai metodi sopra menzionati? Posso contare sui valori di SQLException.getSQLState? Questi valori sono diversi dal provider DB al provider DB?

+0

[Vedere anche questa risposta] (http://stackoverflow.com/a/1989469/521799) –

risposta

2

I documenti ufficiali che includono SQLStates possono ovviamente essere acquistati, ad un prezzo relativamente alto, da ANSI e XOpen. Tuttavia, la documentazione per la maggior parte dei database contiene elenchi di SQLStates. Probabilmente gli elenchi online più completi (e accessibili) si trovano nei manuali di DB2. Controlla il DB2 Universal Messages manual, per esempio. Oracle (password TechNet richiesta) e Sybase, tra gli altri, hanno anche elenchi online.

Per quanto riguarda la seconda domanda, questo è l'intento di SQLState, tuttavia, i vari database hanno vari gradi di conformità. Ad esempio, alcuni mappano più messaggi di errore nativi allo stesso SQLState. Per uso generico, si dovrebbe probabilmente concentrarsi sul codice importante (i primi due caratteri di SQLState,) quindi determinare se informazioni più specifiche sono disponibili nel codice minore (oltre 000.)

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

1

Questo è in qualche modo dipendente dal driver JDBC. Sembrano esserci valori standard, oltre ad alcuni valori proprietari.

Come guida per ciò che è possibile, il livello JDBC di Spring include codice di errore SQL e traduzione di stato. Fornisce un SQLState translator che dà una traduzione eccezionalmente vaga, così come uno SQLErrorCode translator che è molto più a grana fine, utilizzando codici di errore proprietari noti.

Se non è possibile utilizzare Spring, quindi scaricare il codice sorgente ed estrarre il file sql-error-codes.xml, che contiene il mapping dai codici ai tipi di eccezione.

2

Gli standard X/Open (ora Open Group) sono ora disponibili gratuitamente (ma è richiesta la registrazione). Vedi Data Management: SQL Call Level Interface (CLI) per lo standard SQL CLI (aka ODBC), i codici SQLSTATE sono definiti nell'Appendice A. E Data Management: Structured Query Language (SQL), Version 2 per lo standard SQL, i codici SQLSTATE sono definiti nell'Appendice B. Come per gli standard ISO, mentre devi pagare per le versioni ufficiali , le bozze finali (che sono quasi identiche) sono liberamente disponibili; per SQL: 2011, vedere pagina 2017 (con numerazione PDF, 1194 per numerazione pagina documento) di Final Committee Draft ISO/IEC FCD 9075-2

Problemi correlati