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

本文关键字:关联 命令 有一个 DataReader | 更新日期: 2023-09-27 18:21:31

我有个问题。你能告诉我这个代码可能出了什么问题吗?所以情况看起来是这样的:程序向我显示这个错误,但不是每次都显示。有时它确实表现出来了,有时却没有。

错误:

System.Data.dll 中发生"System.InvalidOperationException"类型的未处理异常

附加信息:已经有一个打开的DataReader与此命令关联,必须首先关闭。

代码:

 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()")而且效果很好。顺便说一句,对不起我的英语:<

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

为方法使用本地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

相关文章: