Gestione degli errori e dei messaggi nelle applicazioni

Gli errori generati dal Motore di database di SQL Server o dall'istruzione RAISERROR non vengono inclusi in un set di risultati, ma restituiti alle applicazioni attraverso un meccanismo di gestione degli errori distinto rispetto all'elaborazione dei set di risultati.

Ogni API di database dispone di un proprio set di funzioni, interfacce, metodi, oggetti e strutture, mediante i quali restituisce errori e messaggi. In genere, ogni funzione o metodo API restituisce un codice di stato che indica se l'operazione richiesta ha avuto esito positivo o negativo. Se lo stato non indica un esito positivo, l'applicazione può chiamare le funzioni, i metodi o gli oggetti di errore per il recupero delle informazioni relative all'errore.

Il Motore di database può restituire informazioni al chiamante in due modi:

  1. Errori

    • Gli errori in sys.messages con gravità maggiore o uguale a 11.

    • Le istruzioni RAISERROR con gravità maggiore o uguale a 11.

  2. Messaggi

    • Output dell'istruzione PRINT.

    • Output di numerose istruzioni DBCC.

    • Gli errori in sys.messages con gravità minore o uguale a 10.

    • Le istruzioni RAISERROR con gravità minore o uguale a 10.

Nelle applicazioni che utilizzano API quali ADO (ActiveX Data Object) e OLE DB in genere non viene fatta alcuna distinzione tra errori e messaggi. Nelle applicazioni ODBC (Open Database Connectivity) invece i messaggi generano un codice restituito della funzione SQL_SUCCESS_WITH_INFO, mentre gli errori generano un codice restituito SQL_ERROR. Questa differenza risulta più evidente in DB-Library, in cui gli errori vengono restituiti alla funzione di gestione degli errori dell'applicazione, mentre i messaggi vengono restituiti alla funzione di gestione dei messaggi. In modo analogo, quando si utilizza il provider SqlClient, gli errori provocano la generazione dell'eccezione SqlException. I messaggi non alterano il flusso di controllo e possono essere intercettati dal codice dell'applicazione registrando una richiamata per il gestore di evento InfoMessage.

Gli errori vengono generati anche da altri componenti:

  • Il provider OLE DB per SQL Server e il driver ODBC SQL Server generano errori specifici, il cui formato è comunque compatibile con i formati definiti nelle specifiche API.

  • Le librerie di rete generano errori specifici.

  • L'API per stored procedure estese (Extended Stored Procedure) genera errori con un formato specifico.

  • Le procedure guidate, le applicazioni e le utilità di SQL Server, come SQL Server Management Studio e l'utilità sqlcmd, possono generare errori specifici.

Gli errori di questi componenti vengono restituiti all'applicazione chiamante con lo stesso meccanismo di base utilizzato per gli errori del Motore di database. Un'applicazione può elaborare questi errori con la stessa logica di gestione degli errori utilizzata per gli errori del Motore di database. Poiché questi errori vengono generati esternamente al Motore di database, non possono essere elaborati in costrutti Transact-SQL TRY…CATCH. Per ulteriori informazioni, vedere TRY...CATCH (Transact-SQL).

Gestione degli errori ODBC

Con la specifica ODBC è stato introdotto un modello di errore utilizzato come base per i modelli di errore delle API di database generiche, quali ADO, OLE DB e le API basate su ODBC, ovvero RDO, Data Access Object (DAO) e le classi database di MFC (Microsoft Foundation Classes). Ciò si applica anche al driver ODBC di SQL Server Native Client. Nel modello ODBC agli errori sono associati gli attributi seguenti:

  • SQLSTATE

    SQLSTATE è un codice di errore composto da cinque caratteri inizialmente definito nella specifica ODBC. I codici SQLSTATE, comuni a tutti i driver ODBC, consentono di definire nel codice delle applicazioni le funzionalità di base per la gestione degli errori. In tal modo è possibile evitare di controllare tutti i codici di errore restituiti dai vari database. Il codice SQLSTATE ODBC non ha alcuna relazione con l'attributo di stato dei messaggi di errore del Motore di database.

    ODBC 2.x restituisce un set di codici SQLSTATE, mentre ODBC 3.x restituisce un set di codici SQLSTATE conformi alla specifica X/Open Data Management: SQL (Structured Query Language), versione 2 standard. Dato che tutti i driver ODBC restituiscono gli stessi set di codici SQLSTATE, le applicazioni in cui la gestione degli errori è basata su tali codici hanno un livello di portabilità più elevato.

  • Numero di errore nativo

    Il numero di errore nativo rappresenta il numero di errore generato dal database sottostante. Le applicazioni ODBC ricevono i numeri di errore del Motore di database come numeri di errore nativi.

  • Stringa del messaggio di errore

    I messaggi di errore vengono restituiti nel parametro di stringa del messaggio di errore.

Quando una funzione ODBC restituisce uno stato diverso da SQL_SUCCESS, l'applicazione può chiamare SQLGetDiagRec per il recupero delle informazioni relative all'errore. Se, ad esempio, un'applicazione ODBC riceve un errore di sintassi (numero di errore di SQL Server 170), SQLGetDiagRec restituisce le informazioni seguenti.

szSqlState = 42000, pfNative = 170
szErrorMsg =
'[Microsoft][ODBC SQL Server Driver][SQL Server]
                                     Line 1: Incorrect syntax near *'

Mediante la funzione ODBC SQLGetDiagField i driver ODBC possono specificare campi di diagnostica specifici nei record di diagnostica restituiti dal driver stesso. Il driver ODBC di SQL Server prevede campi specifici per le informazioni sugli errori del Motore di database, quali la gravità e i codici di stato.

Per ulteriori informazioni sul recupero dei messaggi di errore nelle applicazioni ODBC, vedere Gestione di errori e messaggi.

Gestione degli errori ADO

ADO utilizza un oggetto di errore e una raccolta di errori per restituire informazioni sugli errori standard, quali il codice SQLSTATE, il numero di errore nativo e la stringa del messaggio di errore. Queste informazioni sono equivalenti alle informazioni corrispondenti restituite in ODBC. Poiché ADO non supporta alcuna interfaccia per gli errori specifica del provider, le informazioni sugli errori specifici del Motore di database, quali la gravità o lo stato, non sono disponibili per le applicazioni ADO.

Per ulteriori informazioni sul recupero dei messaggi di errore nelle applicazioni ADO, vedere Gestione di errori e messaggi.

Gestione degli errori OLE DB

OLE DB utilizza l'interfaccia IErrorInfo per restituire informazioni sugli errori standard, quali SQLSTATE, il numero di errore nativo e la stringa di errore. Queste informazioni sono equivalenti alle informazioni corrispondenti restituite in ODBC. Il provider OLE DB per SQL Server definisce un'interfaccia ISQLServerErrorInfo per la restituzione delle informazioni specifiche del Motore di database, quali la gravità, lo stato, il nome della procedura e il numero di riga.

Per ulteriori informazioni sul recupero dei messaggi di errore nelle applicazioni OLE DB, vedere Errori.

Gestione degli errori di SqlClient

Il provider gestito SqlClient genera un'eccezione SqlException quando il Motore di database di SQL Server genera un errore non gestito. Mediante la classe SqlException, le applicazioni possono recuperare informazioni sugli errori prodotti sul lato server, compresi numero di errore, messaggio di errore, gravità dell'errore e altre informazioni sul contesto dell'eccezione.

Per l'elaborazione di avvisi o messaggi informativi inviati dal Motore di database di SQL Server, le applicazioni possono creare un delegato SqlInfoMessageEventHandler per l'attesa dell'evento InfoMessage sulla classe SqlConnection. Come avviene per l'eccezione, le informazioni sul contesto del messaggio, quali gravità e stato, vengono passati alla funzione di richiamata come argomenti.