不能重复使用打开的数据读取器

本文关键字:数据 读取 不能 | 更新日期: 2023-09-27 18:36:02

我正在编写一个 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);
        }
    }

}

}

不能重复使用打开的数据读取器

您需要关闭 DataReaders。它们实现了 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);
          }
        }
      }
    }
}