Verbindungsereignisse
Alle .NET Framework-Datenanbieter verfügen über Connection-Objekte mit zwei Ereignissen, mit denen Sie Informationsmeldungen aus einer Datenquelle abrufen oder eine Statusänderung eines Connection-Objekts feststellen können. In der folgenden Tabelle werden die Ereignisse des Connection-Objekts beschrieben.
Ereignis | BESCHREIBUNG |
---|---|
InfoMessage | Dieses Ereignis tritt auf, wenn eine Informationsmeldung aus einer Datenquelle zurückgegeben wird. Bei Informationsmeldungen handelt es sich um Meldungen aus einer Datenquelle, die keine Ausnahme auslösen. |
StateChange | Tritt auf, wenn sich der Zustand des Connection-Objekts ändert. |
Arbeiten mit dem "InfoMessage"-Ereignis
Mit dem InfoMessage-Ereignis des SqlConnection-Objekts können Warnungen und Informationsmeldungen aus einer SQL Server-Datenquelle abgerufen werden. Wenn von einer Datenquelle Fehler mit einem Schweregrad zwischen 11 und 16 zurückgegeben werden, wird eine Ausnahme ausgelöst. Mit dem InfoMessage-Ereignis können jedoch Meldungen aus der Datenquelle abgerufen werden, die keinem Fehler zugewiesen sind. Bei Microsoft SQL Server werden alle Meldungen mit einem Schweregrad von 10 oder weniger als Informationsmeldungen betrachtet und mit dem InfoMessage-Ereignis aufgezeichnet. Weitere Informationen finden Sie im Artikel Schweregrade von Datenbank-Engine-Fehlern.
Das InfoMessage-Ereignis empfängt ein SqlInfoMessageEventArgs-Objekt, das in der Errors-Eigenschaft eine Sammlung der Meldungen aus einer Datenquelle enthält. Die Error-Objekte in dieser Sammlung können auf Fehlernummer und Meldungstext sowie Quelle des Fehlers abgefragt werden. Der .NET Framework-Datenanbieter für SQL Server zeigt außerdem Details zu der Datenbank, der gespeicherten Prozedur und der Zeilennummer an, aus der die Meldung stammt.
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie für das InfoMessage-Ereignis ein Ereignishandler hinzugefügt wird.
' 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);
}
}
Behandeln von Fehlern als "InfoMessages"
Das InfoMessage-Ereignis wird i. d. R. nur für Informations- und Warnmeldungen ausgelöst, die vom Server gesendet werden. Bei einem tatsächlichen Fehler wird die Ausführung der ExecuteNonQuery-Methode oder ExecuteReader-Methode, die den Servervorgang eingeleitet hat, angehalten und eine Ausnahme ausgelöst.
Wenn Sie die Verarbeitung der restlichen Anweisungen in einem Befehl unabhängig von den vom Server erzeugten Fehlern fortsetzen möchten, legen sie die FireInfoMessageEventOnUserErrors-Eigenschaft der SqlConnection auf true
fest. Bei dieser Vorgehensweise wird bei Fehlern von der Verbindung das InfoMessage-Ereignis ausgelöst, anstatt eine Ausnahme auszulösen und die Verarbeitung zu unterbrechen. Die Clientanwendung kann dann dieses Ereignis behandeln und auf Fehlerbedingungen reagieren.
Hinweis
Wenn aufgrund eines Fehlers mit einem Schweregrad von 17 oder höher der Server die Verarbeitung des Befehls abbricht, muss dieser Fehler als Ausnahme behandelt werden. In diesem Fall wird unabhängig davon, wie der Fehler im InfoMessage-Ereignis behandelt wird, eine Ausnahme ausgelöst.
Arbeiten mit dem "StateChange"-Ereignis
Das StateChange-Ereignis tritt auf, wenn sich der Zustand eines Connection-Objekts ändert. Das StateChange-Ereignis erhält StateChangeEventArgs, mit denen Sie anhand der OriginalState-Eigenschaft und CurrentState-Eigenschaft Zustandsänderungen des Connection-Objekts ermitteln können. Die OriginalState-Eigenschaft ist eine ConnectionState-Enumeration, die den Zustand des Connection-Objekts vor der Änderung angibt. CurrentState ist eine ConnectionState-Enumeration, die den Zustand des Connection-Objekts nach der Änderung angibt.
Im folgenden Codebeispiel wird mit dem StateChange-Ereignis eine Meldung in die Konsole geschrieben, sobald sich der Zustand des Connection-Objekts ändert.
' 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);
}