2016-12-12 65 views
0

即使我打電話close()的讀者,我仍然得到以下錯誤消息:獲得一個「已經有與此命令必須先關閉相關聯的打開的DataReader」錯誤

已經有一個打開與此命令關聯的DataReader,必須先關閉

只有在存在2個或多個空的Document_No字段時纔會發生。

if (textBoxDocNum.Text == "") 
{ 
    SqlConnection baglanti = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\Visual\sw\sw\DMSDataBase.mdf;Integrated Security=True"); 
    baglanti.Open(); 
    SqlCommand emir = new SqlCommand("SELECT Document_No, Doc_IDN FROM Details WHERE Document_No = ''", baglanti); 
    DataTable dt = new DataTable(); 
    SqlDataAdapter da = new SqlDataAdapter(emir); 
    da.Fill(dt); 

    foreach (DataRow dr in dt.Rows) 
    { 
     SqlCommand emir2 = new SqlCommand("SELECT Class, Type, Title, State, Date, Status FROM Document WHERE IDN = "+dr["Doc_IDN"].ToString(), baglanti); 
     SqlDataReader dr2 = emir2.ExecuteReader(); //it explodes here 
     dr2.Read(); 
     if (dr2[0].ToString()==comboBoxClass.Text && dr2[1].ToString() == comboBoxType.Text && dr2[2].ToString() == textBoxTitle.Text && dr2[3].ToString() == State && dr2[5].ToString() == Status) 
     { 
      labelDuplicate.Visible = true; 
      return 0; 
     } 
     dr2.Close(); 
     baglanti.Close(); 
    } 
} 
+4

在你做任何其他事情之前,你應該停止像這樣構建SQL。開始使用參數化的SQL。接下來,請嘗試關閉*命令*,而不僅僅是讀者。第三,使用'using'語句而不是手動調用'Close()'。 –

+0

+1 @JonSkeet(尤其是如果你像你一樣早返回......即使你擊回0,使用也會正確處置) –

回答

2

我覺得你的問題可能是,當你從if語句中返回,讀者不會被關閉。

您應該更改您的代碼以使用using語句。即使你回來,這會關閉你的讀者。連接也是如此。

您的代碼有另一個缺陷。我相信讀者需要一個開放的連接。如果條件爲假,則循環的第一次傳遞將關閉連接,從而導致第二次傳遞失敗。

相關問題