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 将多个usings 链接在一起是完全有效的。 您可以使用不带 的方式堆叠使用来压缩代码,但这并不是一个好的做法。我只是有个坏习惯。

以上是关于ExecuteReader 需要打开的连接的主要内容,如果未能解决你的问题,请参考以下文章

ExecuteReader 需要一个打开且可用的连接 - 当前状态为关闭

System.InvalidOperationException:ExecuteReader 需要打开且可用的连接。连接的当前状态为关闭

ExecuteReader 需要一个开放且可用的连接 Asp.net

ExecuteReader 需要一个开放且可用的连接。连接的当前状态是 Connecting

ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。

.net SqlCommand.ExecuteReader 是不是关闭连接?