已经有一个打开的 DataReader 与此命令关联,必须先关闭

Posted

技术标签:

【中文标题】已经有一个打开的 DataReader 与此命令关联,必须先关闭【英文标题】:There is already an open DataReader associated with this Command which must be closed first 【发布时间】:2015-11-11 23:58:12 【问题描述】:

我有一个问题。你能告诉我这段代码有什么问题吗?所以案例看起来像这样:程序向我显示这个错误,但不是每次都显示。有时它确实显示它,有时它没有。

错误:

System.Data.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:。

代码:

 private void loadlist() 
    
        ItemList.Items.Clear();
        NumberList.Items.Clear();

        newConnection.connection();
        cmd.CommandText = "select * from Items";
        dr = cmd.ExecuteReader();
        
        if (dr.HasRows)
        
            while (dr.Read())
            
                ItemList.Items.Add(dr[0].ToString());
                NumberList.Items.Add(dr[1].ToString());
            
        
        dr.Close();
        newConnection.cnOff();
        
    

我可以删除“dr.Close()”并且它起作用了,在我尝试运行之后,我必须编辑一些代码(写回“dr.Close()”)并且它起作用了。顺便提一句。对不起我的英语:

【问题讨论】:

newConnection 在哪里定义?它可能被定义在你没有关闭的其他地方 'newConnecting' 在 tis 文件中是全局的,我使用了 3 次,每次都关闭它。 【参考方案1】:

为您的方法使用本地 SqlDataReader 实例。另外,如果你使用 using 块,它会负责调用Dispose 方法并清理内存。

using(SqlDataReader dr= cmd.ExecuteReader())

     while (dr.Read())
     
       //read from reader now
        ItemList.Items.Add(dr[0].ToString());
     

您也可以在连接和命令对象上使用 using 块。

var connStr = "ReplaceYourConnectionStringHere"
using (var c = new SqlConnection(connStr))

    using (var cmd = new SqlCommand("SELECT * FROM ITEMS",c))
    
        c.Open();
        using (var dr = cmd.ExecuteReader())
        
            while (dr.Read())
            
                //read from reader now
                //ItemList.Items.Add(dr[0].ToString());
            
        
    
  //No need to explicitly close connection :) Thanks to "using"

using 语句可确保调用 Dispose,即使在您调用对象上的方法时发生异常也是如此

【讨论】:

我在这个using (var cmd = new SqlCommand(c, "SELECT * FROM ITEMS")) 中有错误,不能转换为字符串,顺便说一句,var connStr = "YourConnectionStringHere" 我必须使用@ 才能工作?因为有了它,我可以连接到我的 sqlServer 而不会出现下一个错误 @Recovery 顺序错误。检查更新的答案。

以上是关于已经有一个打开的 DataReader 与此命令关联,必须先关闭的主要内容,如果未能解决你的问题,请参考以下文章

已经有一个打开的 DataReader 与此命令关联,必须先关闭

已经有一个与此命令关联的打开的 DataReader 必须首先关闭 linq [重复]

调用另一个 repo 时出错 - '已经有一个打开的 DataReader 与此命令关联,必须先关闭'

已经有一个打开的 DataReader 与此命令关联,必须先关闭

错误:已经有一个与此命令关联的打开DataReader,必须先关闭它。多个用户

entityframework 已经有一个与此命令关联的打开的 DataReader 必须先关闭