2015-01-04 81 views
0

我正在写一个C#窗体窗体应用程序,我来到上面提到的错误。我认为这是因为我在我的主窗体加载对象中打开一个sql连接和阅读器对象,然后在另一个单击事件处理程序中再次做同样的事情。我不确定我需要做什么来改变我的代码/阻止这种情况的发生(或者甚至是这个问题)。我试图在我的连接字符串中打开MARS,但这并没有解决问题。以下是我的代码。无法重用打开DataReader

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); 
     } 

    } 


} 

}

回答

2

您需要关闭的DataReader。他们实现IDisposable接口,所以最简单的事情就是把他们用块中:

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

其实,你很可能必须处置一切的实现了IDisposable,或者有问题要发生的事。

0

至于对方的回答指出,必须整理一下你的点击事件代码:

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); 
      } 
     } 
     } 
    } 

}