Ho il codice seguente:Quando viene chiamato DbConnection.StateChange?
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");
}
}
avvio il codice di cui sopra, mentre l'istanza del server SQL è in esecuzione. Procedere quindi ad eseguire
SHUTDOWN WITH NOWAIT;
sull'istanza del server SQL a cui è connesso il programma. Quindi osservo l'arresto del servizio SQL server. Tuttavia, non vedo mai il messaggio "DB rilevato" nell'output. Perchè è questo?
A parte: Verrà richiamato il gestore di StateChange se poi tenterò di eseguire un'operazione sulla connessione SQL, ma mai in precedenza. C'è un modo in cui questo comportamento può essere cambiato?
"Verrà richiamato il gestore StateChange se tenterò di eseguire un'operazione sulla connessione SQL" - In realtà rispondi alla domanda. L'oggetto Connection non esegue il ping del server e controlla lo stato solo quando necessario. Metti 'connection.Open()' dopo '.StateChange + = ...' per vedere che funziona. –
@AlexKudryashev Non dovrebbe esserci qualche tipo di keep alive tra il client SQL e il server SQL? La mia comprensione è che gli oggetti SqlConnection dovrebbero mappare le sessioni one-to-one al server SQL. Se il server uccide la sessione, c'è un modo in cui posso far passare tali informazioni al mio codice? –
si potrebbe provare a eseguire il polling del server con qualcosa di innocuo come 'selezionare 1' –