Événements de connexion

Tous les fournisseurs de données .NET Framework ont des objets Connection à deux événements que vous pouvez utiliser pour extraire des messages d’information d’une source de données ou pour déterminer si l’état d’un objet Connection a été modifié. La table suivante décrit les événements de l'objet Connexion.

Événement Description
InfoMessage Se produit lorsqu'un message d'information est retourné à partir d'une source de données. Les messages d'information sont des messages provenant d'une source de données qui ne se traduisent pas par la levée d'une exception.
StateChange Se produit lorsque l'état de Connexion change.

Utilisation de l'événement InfoMessage

Vous pouvez extraire des messages d'avertissement et d'information d'une source de données SQL Server à l'aide de l'événement InfoMessage de l'objet SqlConnection. Les erreurs retournées par la source de données, dont le niveau de gravité est compris entre 11 et 16, lèvent une exception. L'événement InfoMessage peut néanmoins être utilisé pour obtenir des messages de la source de données qui ne sont pas associés à une erreur. Dans le cas de Microsoft SQL Server, toute erreur dont le niveau de gravité est inférieur ou égal à 10 est considérée comme étant un message d'information et peut être capturée à l'aide de l'événement InfoMessage. Pour plus d’informations, consultez l’article Niveaux de gravité des erreurs du moteur de base de données.

L’événement InfoMessage reçoit un objet SqlInfoMessageEventArgs contenant, dans sa propriété Erreurs, une collection des messages de la source de données. Vous pouvez interroger les objets Erreur dans cette collection pour obtenir le numéro d’erreur et le texte du message, ainsi que la source de l’erreur. Le fournisseur de données .NET Framework pour SQL Server contient aussi des détails concernant la base de données, la procédure stockée et le numéro de la ligne d'origine du message.

Exemple

L'exemple de code suivant montre comment ajouter un gestionnaire d'événements pour l'événement 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);  
  }  
}  

Gestion des erreurs comme des InfoMessages

L'événement InfoMessage se déclenche uniquement pour les messages d'information et d'avertissement en provenance du serveur. Toutefois, quand une erreur réelle se produit, l'exécution de la méthode ExecuteNonQuery ou ExecuteReader à l'origine de l'opération du serveur est arrêtée et une exception est levée.

Si vous souhaitez continuer à traiter le reste des instructions d'une commande indépendamment des erreurs générées par le serveur, définissez la propriété FireInfoMessageEventOnUserErrors de l'objet SqlConnection sur true. Cela a pour effet de déclencher l'événement InfoMessage pour des erreurs, au lieu de lever une exception et d'interrompre le traitement. L'application cliente peut ensuite gérer cet événement et répondre à des conditions d'erreur.

Notes

Une erreur dont le niveau de gravité est égal ou supérieur à 17 qui entraîne un arrêt de traitement de la commande par le serveur doit être gérée comme une exception. Dans ce cas, une exception est levée, indépendamment de la manière dont l'erreur est gérée dans l'événement InfoMessage.

Utilisation de l'événement StateChange

L'événement StateChange se produit lorsque l'état de Connexion change. L'événement StateChange reçoit StateChangeEventArgs qui vous permet de déterminer la modification de l'état de Connexion à l'aide des propriétés OriginalState et CurrentState. La propriété OriginalState est une énumération ConnectionState qui indique l'état de Connexion avant sa modification. CurrentState est une énumération ConnectionState qui indique l'état de Connexion après sa modification.

L'exemple de code suivant utilise l'événement StateChange pour écrire un message sur la console lorsque l'état de Connexion change.

' 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);  
}  

Voir aussi