C# 如何关闭被遗忘的连接?

C# 如何关闭被遗忘的连接?,c#,sqldatareader,sqlconnection,C#,Sqldatareader,Sqlconnection,我创建了一个连接和一个SqlReader,但忘记关闭它们: SqlConnection conn = new SqlConnection("connection info"); conn.Open(); string sql = "SQL command HERE"; SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader reader = cmd.ExecuteReader(); 现在,当再次尝试运行代码时,总是会出现以下错误:

我创建了一个连接和一个SqlReader,但忘记关闭它们:

SqlConnection conn = new SqlConnection("connection info");
conn.Open();

string sql = "SQL command HERE";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader reader = cmd.ExecuteReader();
现在,当再次尝试运行代码时,总是会出现以下错误:

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
这告诉我如何正确地打开和关闭连接,但没有解释如何关闭仍在运行的连接

我试着关闭电脑,我试着查看SQL server上数据库的选项,发现没有任何有用的。。。我更改了代码,只关闭连接和它编译并运行的读取器,但在更改回代码后问题仍然存在

我怎样才能关闭这个鬼连接?有没有办法用暴力来关闭所有正在运行的连接

我真的解决不了这个问题。解决方法是将MultipleActiveResultSets=true添加到连接字符串中

将创建内容包装在a中-这将始终确保连接关闭:

using(SqlConnection conn = new SqlConnection("connection info"))
{
   // your code
}
将创建内容包装为-这将始终确保连接关闭:

using(SqlConnection conn = new SqlConnection("connection info"))
{
   // your code
}
我不认为您可以访问ghost对象,为了将来,只要在可能的情况下使用construct:

using(SqlConnection conn = new SqlConnection("connection info"))
{
   conn.Open();

   string sql = "SQL command HERE";
   SqlCommand cmd = new SqlCommand(sql, con);
   SqlDataReader reader = cmd.ExecuteReader();
....
}
我不认为您可以访问ghost对象,为了将来,只要在可能的情况下使用construct:

using(SqlConnection conn = new SqlConnection("connection info"))
{
   conn.Open();

   string sql = "SQL command HERE";
   SqlCommand cmd = new SqlCommand(sql, con);
   SqlDataReader reader = cmd.ExecuteReader();
....
}

事实是,即使在关闭或处理连接时,它也不会真正消失,除非在连接字符串中显式禁用池。但是你可以这样做


事实是,即使在关闭或处理连接时,它也不会真正消失,除非在连接字符串中显式禁用池。但是你可以这样做


所有这些答案都告诉你如何避免这个问题,但它们不能解释问题是什么

SqlDataReader提供仅向前的数据访问,这意味着一旦您使用了它并完成了访问,就必须关闭并创建一个新的数据访问。请详细解释。基本上,如果您不关闭DataReader,那么它将保持打开状态,专用于该连接和命令

正如其他人所说,最好确保关闭所有资源

using (SqlConnection connection = new SqlConnection("...")) {
    connection.Open();

    string sql = "SQL command HERE";

    using (SqlCommand cmd = new SqlCommand(sql, con))
    using (SqlDataReader reader = cmd.ExecuteReader()) {
            // do your stuff
    }
}

所有这些答案都告诉你如何避免这个问题,但它们不能解释问题是什么

SqlDataReader提供仅向前的数据访问,这意味着一旦您使用了它并完成了访问,就必须关闭并创建一个新的数据访问。请详细解释。基本上,如果您不关闭DataReader,那么它将保持打开状态,专用于该连接和命令

正如其他人所说,最好确保关闭所有资源

using (SqlConnection connection = new SqlConnection("...")) {
    connection.Open();

    string sql = "SQL command HERE";

    using (SqlCommand cmd = new SqlCommand(sql, con))
    using (SqlDataReader reader = cmd.ExecuteReader()) {
            // do your stuff
    }
}

看看所有的答案,他们似乎告诉你如何避免这个问题

如果我没有弄错的话,您的意思是,客户端PC和服务器sql server上都存在连接,因为您忘记关闭它,您担心它永远挂在那里

将您与服务器的连接视为电话对话。我可以挂断你的电话,但你的手机需要几秒钟才能意识到连接丢失。你可能坐在那里想我是否挂断了电话,或者只是不说话了。你真的不知道。当连接未正确关闭时,服务器上会发生这种情况。在旧的固定电话线上,你可以把电话挂断,无限期地挂断

通过在代码中关闭连接,您实际上是在告诉服务器在关闭自己的连接之前关闭其连接端。如果您未能关闭连接,当程序退出或重新启动时,它将在您端关闭,但服务器可能处于打开的连接状态。想想有人坐在那里想知道他是不是挂断了我的电话

如果我没有弄错的话,您希望在SQL server端关闭它。让他们挂断电话

重新启动后,它将完全关闭。它应该在服务器上自行清除

但是,如果您想自己执行此操作,可以使用以下信息在代码端的服务器上清除:


一种简单得多的方法是在SQLServerManagementStudio中执行此操作,如下所述:

查看所有答案,它们似乎会告诉您如何避免此问题

如果我没有弄错的话,您的意思是,客户端PC和服务器sql server上都存在连接,因为您忘记关闭它,您担心它永远挂在那里

将您与服务器的连接视为电话对话。我可以挂断你的电话,但你的手机需要几秒钟才能意识到连接丢失。你可能坐在那里想我是否挂断了电话,或者只是不说话了。你真的不知道。当连接未正确关闭时,服务器上会发生这种情况。在旧的固定电话线上,你可以把电话挂断,无限期地挂断

通过在代码中关闭连接,您实际上是在告诉服务器在关闭自己的连接之前关闭其连接端。如果你 要关闭连接,当程序退出或重新启动时,它将在您端关闭,但服务器可能处于打开连接状态。想想有人坐在那里想知道他是不是挂断了我的电话

如果我没有弄错的话,您希望在SQL server端关闭它。让他们挂断电话

重新启动后,它将完全关闭。它应该在服务器上自行清除

但是,如果您想自己执行此操作,可以使用以下信息在代码端的服务器上清除:


一种简单得多的方法是在SQLServerManagementStudio中完成,如下所述:

我知道这是一篇老文章,这可能对任何人都没有帮助。但我看到了一个机会,可以发表我对这个问题的看法

首先,您正在创建一个名为conn的SqlConnection,但在名为cmd的SqlCommand中,您正在调用con作为您的连接。这是一个问题:

SqlConnection conn = new SqlConnection("connection info");
conn.Open();

string sql = "SQL command HERE";
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataReader reader = cmd.ExecuteReader();
这可能就是它给您带来错误的原因:

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
其次,要在完成后关闭conn,请使用:

conn.Close();
第三,要关闭您使用的SqlDataReader:

reader.Close();
但您刚刚将SqlDataReader分配给了reader。您从未真正打开过SqlDataReader。要打开它,请使用:

reader.Read();
或:

现在,在打开和关闭连接和SqlDataReader时初始化连接和SqlDataReader的正确方法是:

using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
    conn.Open();

    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "SELECT * FROM TableName;";

        SqlDataReader reader = cmd.ExecuteReader();

        reader.Read();

        if (reader.HasRows)
        {
            strCol1 = reader.GetValue(0).ToString();
        }

        reader.Close();
  }

  conn.Close();
}

我知道这是一个老帖子,可能对任何人都没有帮助。但我看到了一个机会,可以发表我对这个问题的看法

首先,您正在创建一个名为conn的SqlConnection,但在名为cmd的SqlCommand中,您正在调用con作为您的连接。这是一个问题:

SqlConnection conn = new SqlConnection("connection info");
conn.Open();

string sql = "SQL command HERE";
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataReader reader = cmd.ExecuteReader();
这可能就是它给您带来错误的原因:

System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
其次,要在完成后关闭conn,请使用:

conn.Close();
第三,要关闭您使用的SqlDataReader:

reader.Close();
但您刚刚将SqlDataReader分配给了reader。您从未真正打开过SqlDataReader。要打开它,请使用:

reader.Read();
或:

现在,在打开和关闭连接和SqlDataReader时初始化连接和SqlDataReader的正确方法是:

using (SqlConnection conn = new SqlConnection(sqlConnectionString))
{
    conn.Open();

    using (SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText = "SELECT * FROM TableName;";

        SqlDataReader reader = cmd.ExecuteReader();

        reader.Read();

        if (reader.HasRows)
        {
            strCol1 = reader.GetValue(0).ToString();
        }

        reader.Close();
  }

  conn.Close();
}


是的,我在我添加到OP的链接上发现了它。但我的问题是,它只适用于将来的呼叫,不会关闭我正在运行的连接。@DiAlex-我不太明白你的意思。一旦应用程序存在,连接就会关闭。您看到的错误是由于您在重新使用之前没有关闭连接。好的,这很好。但是每次我运行应用程序时,都会创建一个新的连接,所以重用问题不应该存在,因为我正在使用一个新的连接,对吗?顺便说一句,using语句、连接或SqlDataReader中应该包含什么?Thx@DiAlex-每个都有一个。是的,我在我的OP中添加的链接上发现了。但我的问题是,它只适用于将来的呼叫,不会关闭我正在运行的连接。@DiAlex-我不太明白你的意思。一旦应用程序存在,连接就会关闭。您看到的错误是由于您在重新使用之前没有关闭连接。好的,这很好。但是每次我运行应用程序时,都会创建一个新的连接,所以重用问题不应该存在,因为我正在使用一个新的连接,对吗?顺便说一句,using语句、连接或SqlDataReader中应该包含什么?Thx@DiAlex-每个都使用一个。同样,在关闭前一个连接之前,我无法以正确的方式创建新连接。如果conn是全局变量,您可以查看属性以了解连接是否仍然打开,所以请关闭它。@DiAlex-在重新编译应用程序并重新部署它时,您到底有一个打开的连接吗?同样,在关闭前一个连接之前,我无法以正确的方式创建新连接。如果conn是一个全局变量,您可以查看属性以了解连接是否仍然打开,所以请关闭它。@DiAlex-当重新编译应用程序并重新部署它时,您到底有一个打开的连接吗?作为将来的参考,您应该使用许多人编写的using语句。但是,为了避免阻塞问题,如果MSSQLSERVER实例不在生产环境中,请尝试重新启动它。作为将来的参考,您应该使用许多人编写的using语句。但是,为了避免阻塞问题,如果MSSQLSERVER实例不在生产环境中,请尝试重新启动它。+1用于提及多个using语句。Thx的链接,虽然我提到了我的OP:PAh没有看到它。在这个监视器上,你文章中的链接实际上与普通文本相同;无论如何,我希望这对你有帮助。出现此问题的主要原因是,在.NET的ADO.NET框架部分和DataReader所属的部分中,由于您有一个全局变量,它来自于其他注释/答案/回复的声音,因此它保留了对资源的引用,这就是您无法重复使用它的原因。顺便说一句,我使用了您的代码并检查了活动监视器,正如David Stratton所提到的,连接在执行结束时仍然没有关闭。当我打电话时,两个人相遇了
使用相同连接的HOD会出现相同的错误,而当我调用两次相同的方法时,所有操作都会正常进行。因为在没有先调用Close(关闭)的情况下,您不应该使用相同的连接,这不会导致服务器上的连接关闭。如果服务器未关闭连接,则您正在引用未通过调用close关闭的同一连接。这就是为什么你通常应该使用一个全新的连接。你所说的全新连接是什么意思?我在每个方法上都使用new关键字,无法更改SqlConnection的construtor参数。即使是显式调用。关闭连接,不知何故仍然存在。用户不应该处理连接吗?+1用于提及多个using语句。Thx的链接,虽然我提到了我的OP:PAh没有看到它。在这个监视器上,你文章中的链接实际上与普通文本相同;无论如何,我希望这对你有帮助。出现此问题的主要原因是,在.NET的ADO.NET框架部分和DataReader所属的部分中,由于您有一个全局变量,它来自于其他注释/答案/回复的声音,因此它保留了对资源的引用,这就是您无法重复使用它的原因。顺便说一句,我使用了您的代码并检查了活动监视器,正如David Stratton所提到的,连接在执行结束时仍然没有关闭。当我连续调用两个使用相同连接的方法时,我会得到相同的错误,而当我调用两次相同的方法时,所有操作都会正常进行。因为在没有先调用Close(关闭)的情况下,您不应该使用相同的连接,这不会导致连接在服务器上关闭。如果服务器未关闭连接,则您正在引用未通过调用close关闭的同一连接。这就是为什么你通常应该使用一个全新的连接。你所说的全新连接是什么意思?我在每个方法上都使用new关键字,无法更改SqlConnection的construtor参数。即使是显式调用。关闭连接,不知何故仍然存在。用户不应该处理连接吗?这正是我的问题,也是我需要解决的问题!非常感谢你!对于使用SQL server 2008的用户,我建议检查以查找活动监视器选项,因为他们更改了它的位置。这正是我的问题,也是我解决问题所需要的!非常感谢你!对于使用SQLServer2008的用户,我建议检查以查找他们更改位置的活动监视器选项。