2016-06-14 43 views
-1

我收到此错误“已经有一个与此连接关联的打开DataReader,必须先关闭”。我曾尝试使用命令,但仍无法解决此问题。我正在使用的代码如下已经有一个打开的DataReader与此连接相关联,必须先使用c#关闭它。#

{ 
    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(); 

但两者的代码是给完全相同的错误(即:已经有一个用此连接,必须先关闭相关联的打开的DataReader。) 您的帮助将非常感激。 在此先感谢!

+0

为什么您认为(在任一示例中)您需要'cmd.ExecuteReader();'行?打开数据阅读器的那个人,错误信息告诉你,然后你忽略/泄漏它。 –

回答

1

数据集的使用将更方便高效,而不是表。即使您可以缓存它。
也不需要使用使用构造,因为MySqlAdapter的填充方法可以为你做所有的事情。

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(); 
    } 
} 
+0

非常感谢Hameed为这样详细和明确的阐述.. – Farrah

1

这行创建了一个你不关闭的DataReader:

cmd.ExecuteReader(); 

只是删除整条生产线,这是你的情况也没用。

+0

感谢您的回复。错误消失了。但仍然没有获得任何展示。 – Farrah

+1

如果它是一个webform,你可能还需要调用'GridView1.DataBind();',或者'dTable'为null。 –

相关问题