SQLSTATE

Gli SQLSTATE forniscono informazioni dettagliate sulla causa di un avviso o di un errore. Gli SQLSTATE in questo manuale sono basati su quelli presenti nella specifica ISO/IEF CLI, anche se gli SQLSTATE che iniziano con IM sono specifici di ODBC.

A differenza dei codici restituiti, gli SQLSTATE in questo manuale costituiscono delle linee guida e i driver non sono necessari per restituirli. Pertanto, mentre i driver devono restituire l'SQLSTATE appropriato per qualsiasi errore o avviso che sono in grado di rilevare, le applicazioni non devono considerare che ciò si verifichi sempre. I motivi di questa situazione sono due:

  • Incompletezza Anche se questo manuale elenca un numero elevato di errori e avvisi e possibili cause per tali errori e avvisi, non è completo e probabilmente non lo sarà mai; le implementazioni del driver sono soggette a troppe variazioni. Qualsiasi driver specificato probabilmente non restituirà tutti gli SQLSTATE elencati in questo manuale e potrebbe restituire SQLSTATE non elencati nel manuale.

  • Complessità Alcuni motori di database, in particolare i motori di database relazionali, restituiscono letteralmente migliaia di errori e avvisi. È improbabile che i driver per tali motori eseguano il mapping di tutti questi errori e avvisi a SQLSTATE a causa dell'impegno richiesto, dell'inesattezza del mapping, delle dimensioni elevate del codice risultante e del valore basso del codice risultante, che spesso restituisce errori di programmazione che non dovrebbero mai essere rilevati in fase di esecuzione. Pertanto, i driver devono eseguire il mapping di tutti gli errori e degli avvisi che appaiano ragionevoli e assicurarsi di eseguire il mapping di errori e avvisi su cui potrebbe essere basata la logica dell'applicazione, ad esempio SQLSTATE 01004 (dati troncati).

Poiché gli SQLSTATE non vengono restituiti in modo affidabile, la maggior parte delle applicazioni li mostra solo all'utente insieme al messaggio di diagnostica associato, che viene spesso adattato all'errore o all'avviso specifico che si è verificato e al codice errore nativo. Raramente ciò comporta una perdita di funzionalità, perché in ogni caso le applicazioni non possono basare la logica di programmazione sulla maggior parte degli SQLSTATE. Si supponga, ad esempio, che SQLExecDirect restituisca SQLSTATE 42000 (Errore di sintassi o violazione di accesso). Se l'istruzione SQL che ha causato questo errore è hardcoded o compilata dall'applicazione, si tratta di un errore di programmazione e il codice deve essere corretto. Se l'istruzione SQL viene immessa dall'utente, si tratta di un errore utente e l'applicazione ha fatto tutto il possibile informando l'utente del problema.

Quando le applicazioni eseguono la logica di programmazione di base in SQLSTATE, devono essere preparate affinché SQLSTATE non venga restituito o affinché venga restituito un SQLSTATE diverso. L’elenco esatto degli SQLSTATE restituiti in modo affidabile può basarsi solo sull'esperienza con numerosi driver. Tuttavia, una linea guida generale è che è più probabile che vengano restituiti in modo affidabile gli SQLSTATE per gli errori che si verificano nel driver o in Gestione driver, anziché nell'origine dati. Ad esempio, la maggior parte dei driver probabilmente restituisce SQLSTATE HYC00 (funzionalità facoltativa non implementata), mentre un numero inferiore di driver probabilmente restituisce SQLSTATE 42021 (colonna già esistente).

Gli SQLSTATE seguenti indicano errori di run-time o avvisi e sono candidati validi su cui basare la logica di programmazione. Tuttavia, non esiste alcuna garanzia che tutti i driver li restituiscano.

  • 01004 (Dati troncati)

  • 01S02 (Valore opzione modificato)

  • HY008 (Operazione annullata)

  • HYC00 (Funzionalità facoltativa non implementata)

  • HYT00 (Timeout scaduto)

SQLSTATE HYC00 (Funzionalità facoltativa non implementata) è particolarmente importante perché è l'unico modo in cui un'applicazione può determinare se un driver supporta un'istruzione o un attributo di connessione specifico.

Per un elenco completo di SQLSTATE e delle funzioni restituite, vedere Appendice A: Codici errore ODBC. Per una spiegazione dettagliata delle condizioni in cui ogni funzione potrebbe restituire un determinato SQLSTATE, vedere tale funzione.