Как обновить состояние SqlConnection? - PullRequest
1 голос
/ 29 июня 2011

У меня есть этот код:

if (  con.SqlConnection.State == System.Data.ConnectionState.Broken ||
      con.SqlConnection.State == System.Data.ConnectionState.Closed      
){
    con.SqlConnection.Open();
}

Я потерял связь с сетью. Когда я прихожу к своему if, тогда мой SqlConnection.State все еще говорит, что открыто.

Как мне обновить состояние моего SqlConnection

Ответы [ 4 ]

4 голосов
/ 29 июня 2011

Это один из немногих случаев, когда следует полагаться на исключения.

Microsoft фактически рекомендует реагировать на исключение, а не проверять эту переменную состояния.Вспомните случай, когда вы проверяете переменную, а затем через наносекунду соединение обрывается.

Я полагаю, что два, которые будут выброшены, это InvalidOperationException или SqlException.

3 голосов
/ 11 ноября 2017

В TCP-соединениях есть только один гарантированный способ понять, если соединение еще живо, это отправка нового пакета в открытый сокет.

Так что, пока мы предполагаем, что вы подключены к Sql Server через TCP-соединение, это правило также применимо к нему. Поэтому вам нужно отправить данные и подождать, если возникнет исключение.

    public bool IsConnected()
    {
        if (db == null) //db here is an Entity
            return false;

        //in my case Connection is an sqlconnection object so you can 
        //apply the same to your connection
        if (db.Database.Connection.State == ConnectionState.Closed)
            return false;

        try
        {
            var cmd = db.Database.Connection.CreateCommand();
            cmd.CommandText = "SELECT 0";
            cmd.ExecuteNonQuery();
        }
        catch
        {
            return false;
        }

        return true;
    }
2 голосов
/ 29 июня 2011

Вы всегда можете отслеживать состояние вашего SqlConnection, используя SqlConnection.StateChange Event

1 голос
/ 20 октября 2011

Ленивый способ: " SELECT 0 ".Если команда не выполняется, состояние соединения обновляется до «Закрыто»

if (DBConn.State == ConnectionState.Open)
{
   try
   {
      using(SqlCommand cmd = new SqlCommand(DBConn))
      {
         cmd.CommandText = "SELECT 0";
         cmd.ExecuteNonQuery();
      }
   }
   Catch
   {
      DBConn.Close(); \\Declare the connection dead.
   }
}
...