如何关闭忘记的连接
本文关键字:连接 忘记 何关闭 | 更新日期: 2023-09-27 18:31:22
我创建了一个连接和一个 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服务器上查看数据库的选项(发现没有用)...我更改了代码以仅关闭连接和读取器(它编译并运行,但更改回代码后问题仍然存在)。
如何关闭此"幽灵"连接?有没有办法(蛮力)关闭所有正在运行的连接?
[编辑:] 我无法真正解决问题。解决方法是将MultipleActiveResultSets=true
添加到连接字符串
我认为您无法访问幽灵对象,将来只需在可能的情况下使用using
构造:
using(SqlConnection conn = new SqlConnection("connection info"))
{
conn.Open();
string sql = "SQL command HERE";
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataReader reader = cmd.ExecuteReader();
....
}
创建内容包装在 using
语句中 - 这将始终确保连接关闭:
using(SqlConnection conn = new SqlConnection("connection info"))
{
// your code
}
查看所有答案,它们似乎告诉您如何避免问题。
如果我没记错的话,你的意思是客户端(你的PC)和服务器(sql服务器)上都存在连接,因为你忘记关闭它,你担心它永远挂在那里。
将您与服务器的连接视为电话交谈。 我可以挂断你的电话,但你的手机需要几秒钟才能意识到连接丢失了。 你可能坐在那里想知道我是否挂断了电话,或者只是不再说话。 你真的不知道。 这是当连接未正确关闭时在服务器上发生的情况。 (在较旧的固定电话上,您可以不挂断电话并无限期地捆绑线路。
通过在代码中关闭连接,您可以有效地告诉服务器在关闭自己的连接之前关闭其连接结束。 如果您未能关闭连接,则在程序退出或重新启动时,它将在您一端关闭,但服务器可能会在那里打开连接。 (想想有人坐在那里想知道"他刚刚挂断了我的电话吗?
如果我没记错的话,您想要在SQL服务器端关闭它。 (让他们"挂断电话"。
重新启动后,它完全关闭。 它应该在服务器上自行清除。
但是,如果要自己执行此操作,则可以使用以下信息在代码端的服务器中清除它:如何终止与 SQL Server 2005 数据库的所有当前连接?
一种更简单的方法是在SQL Server Management Studio中执行此操作,如下所述:http://www.mikebevers.be/blog/2009/07/kill-open-sql-processes-connections/
所有这些答案都告诉你如何避免这个问题,但它们并没有解释问题是什么。
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
}
}
说实话,即使您"关闭"或"处置"连接,除非您在连接字符串中明确禁用池化,否则它也不会真正消失。但是,您可以这样做
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearpool.aspx
这是一个旧帖子,这可能对任何人都没有帮助。但是我看到了一个机会来发布我认为这个问题的错误。
首先,您正在创建一个名为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.Close();
第三,要关闭 SqlDataReader,请使用:
reader.Close();
但是您刚刚将 SqlDataReader 分配给了读取器。你从未真正打开过 SqlDataReader。要打开它,请使用:
reader.Read();
或:
while (reader.Read())
{
// Code
}
现在是在打开和关闭连接和 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();
}