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