已经有一个与此Connection关联的打开DataReader,必须先使用c#关闭它

时间:2016-06-14 06:25:31

标签: c# mysql

我收到此错误“已经有一个与此Connection关联的打开的DataReader必须先关闭”。我尝试过使用命令但仍无法解决此问题。我使用的代码如下

{
    conn.Open();
    queryStr = "";
    queryStr = "select * from mydata.items;";
    cmd = new MySqlCommand(queryStr, conn);
    cmd.ExecuteReader();
    using (MySqlDataAdapter MyAdapter = new MySqlDataAdapter())
   {
       MyAdapter.SelectCommand = cmd;
       using (DataTable dTable = new DataTable())
    {
        MyAdapter.Fill(dTable);
        GridView1.DataSource = dTable;
    }
   }
}

我最初尝试使用下面的代码(不使用命令)。

    conn.Open();
    queryStr = "";
    queryStr = "select * from mydata.items;";
    cmd = new MySqlCommand(queryStr, conn);
    cmd.ExecuteReader();
    MySqlDataAdapter MyAdapter = new MySqlDataAdapter();
    MyAdapter.SelectCommand = cmd;
    DataTable dTable = new DataTable();        
    MyAdapter.Fill(dTable);
    GridView1.DataSource = dTable;
    conn.Close();

但是这两个代码都给出了完全相同的错误(即已经有一个与此Connection关联的开放DataReader,必须先关闭它。) 非常感谢您的帮助。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

此行创建一个您未关闭的DataReader:

cmd.ExecuteReader();

只需删除整行,在你的情况下就没用了。

答案 1 :(得分:1)

数据集的使用将比桌子更方便和有效。即使你可以缓存它 也不需要使用using构造因为MySqlAdapter的fill方法为你做了一切就像

i)打开连接。 ii)阅读命令ii)执行命令ii)关闭连接

 using ()
  {
   if(Cache["mydata"]==null)
    {
            queryStr = "";
            queryStr = "select * from mydata.items;";
            cmd = new MySqlCommand(queryStr, conn);
            MySqlDataAdapter MyAdapter = new MySqlDataAdapter();           
            MyAdapter.SelectCommand = cmd;        
            DataSet ds =new DataSet();
            MyAdapter.Fill(ds);
            Cache["mydata"]=ds;
            GridView1.DataSource = ds;
            GridView1.DataBind();                  
     }
else
  {
             GridView1.DataSource = (DataSet)Cache["mydata"];
             GridView1.DataBind(); 
    }
}