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

时间:2016-12-12 21:31:50

标签: c# sql visual-studio sqldatareader

即使我在阅读器上调用close(),我仍然会收到以下错误消息:

  

已经有一个与此命令关联的打开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();
    }
}

1 个答案:

答案 0 :(得分:2)

我认为您的问题可能是当您从if语句中返回时,读者将不会被关闭。

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

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