Eventi Connection

Tutti i provider di dati .NET Framework presentano oggetti Connection contenenti due eventi che è possibile usare per recuperare messaggi informativi da un'origine dati o per determinare se lo stato di un oggetto Connection è 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.
StateChange Si verifica quando viene modificato lo stato della Connessione.

Utilizzo dell'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. Nel caso di 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 .NET Framework per SQL Server include inoltre 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.  
  AddHandler connection.InfoMessage, _  
    New SqlInfoMessageEventHandler(AddressOf OnInfoMessage)  
  
Private Shared Sub OnInfoMessage(sender As Object, _  
  args As SqlInfoMessageEventArgs)  
  Dim err As SqlError  
  For Each 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)  
  Next  
End Sub  
// Assumes that connection represents a SqlConnection object.  
  connection.InfoMessage +=
    new SqlInfoMessageEventHandler(OnInfoMessage);  
  
protected static void OnInfoMessage(  
  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);  
  }  
}  

Gestione di errori come InfoMessage

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. In questo modo, 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.

Utilizzo dell'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 connection represents a SqlConnection object.  
  AddHandler connection.StateChange, _  
    New StateChangeEventHandler(AddressOf OnStateChange)  
  
Protected Shared Sub OnStateChange( _  
  sender As Object, args As StateChangeEventArgs)  
  
  Console.WriteLine( _  
  "The current Connection state has changed from {0} to {1}.", _  
  args.OriginalState, args.CurrentState)  
End Sub  
// Assumes connection represents a SqlConnection object.  
  connection.StateChange  += new StateChangeEventHandler(OnStateChange);  
  
protected static void OnStateChange(object sender,
  StateChangeEventArgs args)  
{  
  Console.WriteLine(  
    "The current Connection state has changed from {0} to {1}.",  
      args.OriginalState, args.CurrentState);  
}  

Vedi anche