2015-01-04 82 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); 
      } 
     } 
     } 
    } 

}