ExecuteReader 需要打开的连接
Posted
技术标签:
【中文标题】ExecuteReader 需要打开的连接【英文标题】:ExecuteReader requires an open connection 【发布时间】:2015-05-01 15:51:22 【问题描述】:我收到错误消息:“ExecuteReader 需要一个打开的连接”,我知道解决方法是添加一个 connection.Open()/connection.Close()。我与此错误有关的问题更多的是让我了解究竟发生了什么。
我目前正在使用“USING”语句,我希望它可以为我打开和关闭/处理连接。所以我想我不明白为什么它没有按预期工作,我需要自己明确编码 connection.Open() / connection.Close() 来解决这个问题。我做了一些研究,发现人们遇到了类似的问题,因为他们使用的是静态连接。在我的情况下,我正在创建一个新的连接实例......因此,它困扰着我,并希望能够深入了解它,而不是仅仅修复它并继续前进。提前谢谢你。
代码如下:
try
using (SqlConnection connection = new SqlConnection(myConnStr))
using (SqlCommand command = new SqlCommand("mySPname", connection))
command.CommandType = CommandType.StoredProcedure;
//add some parameters
SqlParameter retParam = command.Parameters.Add("@RetVal", SqlDbType.VarChar);
retParam.Direction = ParameterDirection.ReturnValue;
/////////////////////////////////////////////////
// fix - add this line of code: connection.Open();
/////////////////////////////////////////////////
using(SqlDataReader dr = command.ExecuteReader())
int success = (int)retParam.Value;
// manually close the connection here if manually open it. Code: connection.Close();
return Convert.ToBoolean(success);
catch (Exception ex)
throw;
【问题讨论】:
using
不会为您打开连接。所发生的一切是您已致电new SqlConnection(myConnStr)
并保证将其处理。一旦你知道是时候打开它,你仍然需要自己打开它。
【参考方案1】:
Using 不会打开任何连接,它只会在调用 End Using 后释放所有分配的内存。
【讨论】:
我当时想……它之前是如何为我打开它的,现在我意识到我在其他地方打开了它。现在说得通了。谢谢你。我知道这很简单。 不知道现在实际上延迟了接受的答案。我必须等待超过 5 分钟才能接受您的回答 :( 信比永远更好:)【参考方案2】:对于 SqlConnection,您必须在 using 块内显式打开它,但您不需要关闭它。
我还注意到您在 using SqlConnection 周围缺少一组括号 。也许这就是问题?应该是这样的:
try
using (SqlConnection connection = new SqlConnection(myConnStr))
connection.Open();
using (SqlCommand command = new SqlCommand("InsertProcessedPnLFile", connection))
command.CommandType = CommandType.StoredProcedure;
//add some parameters
SqlParameter retParam = command.Parameters.Add("@RetVal", SqlDbType.VarChar);
retParam.Direction = ParameterDirection.ReturnValue;
/////////////////////////////////////////////////
// fix - add this line of code: connection.Open();
/////////////////////////////////////////////////
using(SqlDataReader dr = command.ExecuteReader())
int success = (int)retParam.Value;
// manually close the connection here if manually open it. Code: connection.Close();
return Convert.ToBoolean(success);
【讨论】:
按照 OP 将多个using
s 链接在一起是完全有效的。
您可以使用不带 的方式堆叠使用来压缩代码,但这并不是一个好的做法。我只是有个坏习惯。以上是关于ExecuteReader 需要打开的连接的主要内容,如果未能解决你的问题,请参考以下文章
ExecuteReader 需要一个打开且可用的连接 - 当前状态为关闭
System.InvalidOperationException:ExecuteReader 需要打开且可用的连接。连接的当前状态为关闭
ExecuteReader 需要一个开放且可用的连接 Asp.net
ExecuteReader 需要一个开放且可用的连接。连接的当前状态是 Connecting