Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何刷新SqlConnection的状态?_C#_State_Sqlconnection - Fatal编程技术网

C# 如何刷新SqlConnection的状态?

C# 如何刷新SqlConnection的状态?,c#,state,sqlconnection,C#,State,Sqlconnection,我有以下代码: if ( con.SqlConnection.State == System.Data.ConnectionState.Broken || con.SqlConnection.State == System.Data.ConnectionState.Closed ){ con.SqlConnection.Open(); } 我失去了与网络的连接。当我转到我的if时,我的SqlConnection.State仍然显示open 如何刷新我的SqlC

我有以下代码:

if (  con.SqlConnection.State == System.Data.ConnectionState.Broken ||
      con.SqlConnection.State == System.Data.ConnectionState.Closed      
){
    con.SqlConnection.Open();
}
我失去了与网络的连接。当我转到我的
if
时,我的
SqlConnection.State
仍然显示open


如何刷新我的
SqlConnection

的状态这是少数应该依赖异常的情况之一

Microsoft实际上建议您对异常做出反应,而不是检查该状态变量。想象一下这样一种情况:检查变量,然后一纳秒后连接断开


我相信会抛出的两个异常是
invalidooperationexception
SqlException

您可以始终通过使用

惰性方式来监视
SqlConnection的状态:选择0。如果命令失败,连接状态将更新为“关闭”


在TCP连接上,只有一种有保证的方法可以了解连接是否仍然处于活动状态,即向打开的套接字发送新数据包

因此,只要我们假设您通过TCP连接连接到Sql Server,此规则也适用于它。因此,如果引发异常,您需要发送数据并等待

    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;
    }

如果您在任何时候失去连接,我建议您处理该连接对象并实例化另一个连接对象。@IAbstract:很公平,那么我的应用程序如何知道我失去了连接?这里的流程是什么?你要让这个连接保持多久?我正在运行一个MVVM结构的应用程序,那么我最好的选择是什么呢?在SessionContext中创建一个方法,用try-catch块计算状态?这是一个编程问题。除非有人调用Close或Dispose,否则事件不会激发。@Nix:…或调用Open;)如果连接也超时,则应触发此事件。我没有观察到它的任何其他限制,例如断开、丢失或断开的连接,只是因为我还没有发现这些情况。我可以确认,如果您将其作为事件处理程序,并在运行时有意尝试终止与SQL的连接,则根本不会触发事件。+1:即使使用StateChange事件订阅,它可能不是100%可靠-一个例外肯定会让你知道!!!是的,但是如果他能限制他的关系的寿命,这个问题是可以避免的。@rudolf_franek我刚刚做到了!抱歉,这是我的第一次回复,所以我对文本格式有问题。
    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;
    }