Ich habe den folgenden Code:Wann wird DbConnection.StateChange aufgerufen?
class Program
{
static void Main()
{
var connection = new SqlConnection("myConnectionString");
connection.Open();
connection.StateChange += HandleSqlConnectionDrop;
Console.WriteLine("Hi");
Console.ReadLine();
}
private static void HandleSqlConnectionDrop(object connection, StateChangeEventArgs args)
{
Console.WriteLine("DB change detected");
}
}
ich den obigen Code zu starten, während die SQL-Server-Instanz ausgeführt wird. Ich gehe dann
SHUTDOWN WITH NOWAIT;
auf der SQL-Serverinstanz auszuführen, die das Programm verbunden ist. Ich beobachte dann den SQL-Serverdienst, der anhält. Ich sehe jedoch nie die Meldung "DB change detected" in der Ausgabe. Warum ist das?
Beiseite: Ich werde sehen, dass der StateChange-Handler aufgerufen wird, wenn ich dann versuche, eine Operation auf der SQL-Verbindung durchzuführen, aber nie zuvor. Gibt es eine Möglichkeit, dieses Verhalten zu ändern?
"Ich werde sehen, dass der StateChange-Handler aufgerufen wird, wenn ich dann versuche, eine Operation auf der SQL-Verbindung durchzuführen" - Tatsächlich beantworten Sie Ihre Frage. Das Verbindungsobjekt pingt den Server nicht und überprüft den Status nur bei Bedarf. Platziere 'connection.Open()' nach '.StateChange + = ...' um zu sehen, dass es funktioniert. –
@AlexKudryashev Sollte zwischen dem SQL-Client und dem SQL-Server nicht eine Art von Keep am Leben bleiben? Nach meinem Verständnis sollten SqlConnection-Objekte Eins-zu-eins-SQL-Server-Sitzungen zugeordnet werden. Wenn der Server die Sitzung beendet, kann ich diese Informationen an meinen Code weitergeben? –
Sie könnten versuchen, den Server mit etwas harmlos wie 'Select 1' abzufragen. –