У меня есть следующий код:Когда называется 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");
}
}
я начинаю выше код, когда экземпляр SQL-сервер. Затем я приступаю к исполнению
SHUTDOWN WITH NOWAIT;
на сервере sql-сервера, к которому подключена программа. Затем я наблюдаю остановку службы SQL-сервера. Тем не менее, я никогда не вижу сообщение «обнаружено изменение БД» на выходе. Почему это?
Кроме того: Я увижу, что обработчик StateChange вызывается, если я затем попытаюсь выполнить операцию над SQL-соединением, но никогда раньше. Есть ли способ изменить это поведение?
«Я увижу обработчик StateChange, если я попытаюсь выполнить операцию над SQL-соединением» - на самом деле вы отвечаете на свой вопрос. Объект подключения не поддерживает сервер ping и проверяет состояние только при необходимости. Поместите 'connection.Open()' после '.StateChange + = ...', чтобы увидеть, что он работает. –
@AlexKudryashev Не должно ли существовать какая-то поддержка между SQL-клиентом и SQL-сервером? Я понимаю, что объекты SqlConnection должны сопоставлять индивидуальные сеансы SQL-сервера. Если сервер убивает сеанс, есть ли способ, которым я могу передать эту информацию в мой код? –
, вы можете попробовать опробовать сервер с чем-то безвредным, например 'select 1' –