Eventi di connessione
Si applica a: .NET Framework .NET .NET Standard
Il provider di dati Microsoft SqlClient per SQL Server presenta oggetti relativi alla Connessione contenenti due eventi che è possibile usare per recuperare messaggi informativi da un'origine dati o per determinare se lo stato di una Connessione è stato modificato. Nella tabella seguente vengono illustrati gli eventi dell'oggetto Connessione.
Event | Descrizione |
---|---|
InfoMessage | Si verifica quando un messaggio informativo viene restituito da un'origine dati. I messaggi informativi sono i messaggi di un'origine dati per cui non viene generata un'eccezione. |
Modifica dello stato | Si verifica quando viene modificato lo stato della Connessione. |
Usare l'evento InfoMessage
È possibile recuperare avvisi e messaggi informativi da un'origine dati SQL Server usando l'evento InfoMessage dell'oggetto SqlConnection. Gli errori restituiti da un'origine dati con un livello di gravità compreso tra 11 e 16 generano un'eccezione. Tuttavia, l'evento InfoMessage consente di ottenere dall'origine dati i messaggi che non sono associati a un errore. Con Microsoft SQL Server i messaggi di errore con una gravità uguale o minore di 10 sono considerati informativi e vengono acquisiti usando l'evento InfoMessage. Per altre informazioni, vedere l'articolo Gravità degli errori del motore di database.
L'evento InfoMessage riceve un oggetto SqlInfoMessageEventArgs che contiene, nella proprietà Errori, una raccolta di messaggi dall'origine dati. È possibile eseguire una query negli oggetti Errore di questa raccolta per ottenere il numero dell'errore, il testo del messaggio e l'origine dell'errore. Il provider di dati Microsoft SqlClient per SQL Server include anche i dettagli sul database, sulla stored procedure e sul numero di riga da cui proviene il messaggio.
Esempio
Nell'esempio di codice seguente viene illustrato come aggiungere un gestore eventi per l'evento InfoMessage.
// Assumes that connection represents a SqlConnection object.
connection.InfoMessage +=
(object sender, SqlInfoMessageEventArgs args) =>
{
foreach (SqlError err in args.Errors)
{
Console.WriteLine(
"The {0} has received a severity {1}, state {2} error number {3}\n" +
"on line {4} of procedure {5} on server {6}:\n{7}",
err.Source, err.Class, err.State, err.Number, err.LineNumber,
err.Procedure, err.Server, err.Message);
}
};
Gestire gli errori come InfoMessages
In genere, l'evento InfoMessage verrà generato solo per messaggi informativi e per messaggi di avviso inviati dal server. Tuttavia, quando si verifica un errore, l'esecuzione del metodo ExecuteNonQuery o ExecuteReader che ha avviato l'operazione del server viene interrotta e viene generata un'eccezione.
Per continuare a elaborare le restanti istruzioni di un comando indipendentemente da eventuali messaggi di errore generati dal server, impostare la proprietà FireInfoMessageEventOnUserErrors del tipo SqlConnection su true
. Impostando questa proprietà, invece di generare un'eccezione e di interrompere l'elaborazione, la connessione genera l'evento di errore InfoMessage. L'applicazione client può quindi gestire questo evento e rispondere alle condizioni di errore.
Nota
Un errore con un livello di gravità pari a 17 o superiore che provoca l'interruzione dell'elaborazione del comando da parte del server deve essere gestito come un'eccezione. In questo caso viene generata un'eccezione indipendentemente da come viene gestito l'errore nell'evento InfoMessage.
Usare l'evento StateChange
L'evento StateChange si verifica quando viene modificato lo stato di una Connessione. L'evento StateChange riceve il tipo StateChangeEventArgs che consente di determinare la modifica dello stato della Connessione usando le proprietà OriginalState e CurrentState. La proprietà OriginalState è un'enumerazione ConnectionState che indica lo stato della Connessione prima della modifica. CurrentState è un'enumerazione ConnectionState che indica lo stato della Connessione dopo la modifica.
Nell'esempio di codice seguente viene usato l'evento StateChange per scrivere un messaggio nella console quando viene modificato lo stato della Connessione.
// Assumes that connection represents a SqlConnection object.
connection.StateChange +=
(object sender, StateChangeEventArgs args) =>
{
Console.WriteLine(
"The current Connection state has changed from {0} to {1}.",
args.OriginalState, args.CurrentState);
};