获得一个“已经有与此命令必须先关闭相关联的打开的DataReader”错误

问题描述:

即使我打电话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,使用也会正确处置) –

我觉得你的问题可能是,当你从if语句中返回,读者不会被关闭。

您应该更改您的代码以使用using语句。即使你回来,这会关闭你的读者。连接也是如此。

您的代码有另一个缺陷。我相信读者需要一个开放的连接。如果条件为假,则循环的第一次传递将关闭连接,从而导致第二次传递失败。