不能重用打开的 DataReader

Cannot reuse open DataReader

我正在编写一个 c# windows 表单应用程序,我遇到了上述错误。我认为这是因为我在我的主窗体加载对象中打开一个 sql 连接和阅读器对象,然后在另一个单击事件处理程序中再次执行相同的操作。我不确定我需要做什么才能更改我的代码/阻止这种情况发生(或者这是否是问题所在)。我尝试在我的连接字符串中打开 MARS,但这并没有解决问题。下面是我的代码。

   namespace Excel_Importer
    {
public partial class Export : Form
{
    public Export()
    {
        InitializeComponent();
    }

    private void cmbItemLookup_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    private void Export_Load(object sender, EventArgs e)
    {
                                                                                           string connectionString = ConfigurationManager.ConnectionStrings ["dbconnection"].ConnectionString;

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();

            SqlCommand cmd = new SqlCommand("Select * From ExportItem", conn);
            SqlDataReader rdr;
            rdr = cmd.ExecuteReader();

            System.Data.DataTable dt = new System.Data.DataTable();
            dt.Columns.Add("ExportItemName", typeof(string));
            dt.Load(rdr);

            cmbItemLookup.DisplayMember = "ExportItemName";
            cmbItemLookup.DataSource = dt;
            conn.Close();
        }
    }

    private void btnLoad_Click(object sender, EventArgs e)
    {
        string connectionString = ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString;

        SqlConnection conn = new SqlConnection(connectionString);
        conn.Open();
        SqlCommand cmd2 = new SqlCommand("Select * from " + cmbItemLookup.Text, conn);
        SqlDataReader rdr2;
        rdr2 = cmd2.ExecuteReader();

        try
        {

            SqlDataAdapter ada = new SqlDataAdapter();
            ada.SelectCommand = cmd2;
            DataTable dt = new DataTable();
            ada.Fill(dt);
            BindingSource bs = new BindingSource();
            bs.DataSource = dt;
            dgvExport.DataSource = bs;
            ada.Update(dt);
            conn.Close();
        }

        catch (Exception Ex)
        {
            MessageBox.Show(Ex.Message);
        }

    }


}

}

您需要关闭 DataReader。它们实现了 IDisposable 接口,所以最简单的方法就是将它们放在一个 using 块中:

using (rdr = cmd.ExecuteReader())
{
  ..
} // .NET always calls Dispose() for you here

实际上,您几乎必须 处理所有实现 IDisposable 的东西,否则就会出现问题。

正如其他答案所指出的,您必须整理您的点击事件代码:

private void btnLoad_Click(object sender, EventArgs e)
{
    string connectionString = ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString;

    using (SqlConnection conn = new SqlConnection(connectionString) )
    {
      conn.Open();
      using(SqlCommand cmd2 = new SqlCommand("Select * from " + cmbItemLookup.Text, conn) )
      {
        using(SqlDataReader rdr2= cmd2.ExecuteReader())
        {

          try
          {

            SqlDataAdapter ada = new SqlDataAdapter();
            ada.SelectCommand = cmd2;
            DataTable dt = new DataTable();
            ada.Fill(dt);
            BindingSource bs = new BindingSource();
            bs.DataSource = dt;
            dgvExport.DataSource = bs;
            ada.Update(dt);
            conn.Close();
          }
          catch (Exception Ex)
          {
            MessageBox.Show(Ex.Message);
          }
        }
      }
    }

}