Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# 随机行为:;连接没有关闭。连接';的当前状态为“打开”;_C#_Asp.net_Sql_Asp.net Mvc_Exception - Fatal编程技术网

C# 随机行为:;连接没有关闭。连接';的当前状态为“打开”;

C# 随机行为:;连接没有关闭。连接';的当前状态为“打开”;,c#,asp.net,sql,asp.net-mvc,exception,C#,Asp.net,Sql,Asp.net Mvc,Exception,这很奇怪,虽然这段代码经常执行,但它只是偶尔发生 我让这段代码每5秒运行一次,效果很好,但有时我会将异常保存在日志中 异常消息:连接未关闭。连接的当前状态为“打开” public class Log { static SqlConnection sqlConnection{get; set;} public Log() { sqlConnection = new SqlConnection(CNN_STRING); } publ

这很奇怪,虽然这段代码经常执行,但它只是偶尔发生

我让这段代码每5秒运行一次,效果很好,但有时我会将异常保存在日志中

异常消息:连接未关闭。连接的当前状态为“打开”

 public class Log
{

    static SqlConnection sqlConnection{get; set;}

    public Log()
    {
        sqlConnection = new SqlConnection(CNN_STRING);
    }



    public static void Save(){
        StringBuilder sb = new StringBuilder();

        sb.Append("UPDATE Blabla SET ...");

        SqlCommand command = new SqlCommand(sb.ToString(), sqlConnection);


         try
        {
            if (sqlConnection.State == ConnectionState.Open) { sqlConnection.Close(); }
            sqlConnection.Open();
            command.ExecuteNonQuery();
            sqlConnection.Close();
        }catch(Exception e){
            Log.AddLog("Log ", 1, string.Concat("Query: ", sb.ToString(), 
                       "Exception    message: ", e.Message));
        }
        finally
        {
            if (sqlConnection.State == ConnectionState.Open) { sqlConnection.Close(); }
        }
   }

有什么线索吗?

在ASP.NET中使用静态连接不是一个好主意,因为每个请求都会共享此连接,这将导致锁处于最佳状态,甚至出现类似您的错误

也许我前一段时间发的帖子很有帮助。因此,不要将其设置为静态,使用
using
-语句

using(var sqlConnection = new SqlConnection(CNN_STRING))
using (var command = new SqlCommand(sb.ToString(), sqlConnection))
{
    sqlConnection.Open();
    command.ExecuteNonQuery();
}

您不需要关闭连接,因为这是通过using语句(dispose)完成的。

考虑使用来处理
SqlConnection
SqlCommand
。如果连接已经打开,为什么要关闭它并重新打开它?它不是最快的,而且有成本。当您再次尝试打开连接时,很可能连接仍在关闭。是否显示
sqlConnection
的声明,是否为
static
?然后把它变成一个局部变量,你就完成了。@TimSchmelter它是静态的,因为这个方法也是静态的,我的意思是,它是一个静态类,有一些静态函数使用ConnectionTank作为链接,现在我必须更改600行代码,因为我将ADO.NET功能封装到了DB helper类中!顺便说一下,“使用”将始终关闭/处理连接,对吗?