C# 已存在与此命令关联的打开的DataReader,必须先关闭该命令。

C# 已存在与此命令关联的打开的DataReader,必须先关闭该命令。,c#,winforms,C#,Winforms,我有一个用于申请编号的组合框。从组合框中选择请购单编号时,我们应获得申请该特定请购单的成本中心。代码如下: cmd.Connection = con; if (con.State != ConnectionState.Open) { con.Open(); } txtcc.Text = ""; if (cmbreqno.SelectedValue != null || Conv

我有一个用于申请编号的组合框。从组合框中选择请购单编号时,我们应获得申请该特定请购单的成本中心。代码如下:

        cmd.Connection = con;
        if (con.State != ConnectionState.Open)
        {
            con.Open();
        }
        txtcc.Text = "";
        if (cmbreqno.SelectedValue != null || Convert.ToString(cmbreqno.SelectedValue) != "")
        {
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "sp_displaycostcenter";
            cmd.Parameters.AddWithValue("@req_no", cmbreqno.SelectedValue);

            SqlDataReader rdr = cmd.ExecuteReader();


            adp.Fill(dsreqno,"selectedpurchase");
            if (dsreqno.Tables["selectedpurchase"].Rows.Count > 0)
            {
                txtcc.Text = dsreqno.Tables["selectedpurchase"].Rows[0]["req_no"].ToString();
            }
            dsreqno.Tables["selectedpurchase"].Clear();

        }
        cmd.Parameters.Clear();
        //rdr.Close();
        con.Close();
试试这个:

    if (con.State != ConnectionState.Open)
    {
        con.Open();
    }
    txtcc.Text = "";
    if (cmbreqno.SelectedValue != null || Convert.ToString(cmbreqno.SelectedValue) != "")
    {
        cmd.Connection = con;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "sp_displaycostcenter";
        cmd.Parameters.AddWithValue("@req_no", cmbreqno.SelectedValue);

        SqlDataReader rdr = cmd.ExecuteReader();
        if (rdr.Read())
        {
         txtcc.Text= rdr[0].ToString();//assuming sp_displaycostcenter returns costcenter.
        }
        rdr.Close();

    }        
    con.Close();

您可以使用MSDN()中的标准代码块读取如下所示的数据,并用自己的变量替换变量:

private static DataSet SelectRows(DataSet dataset,
                                  string connectionString,
                                  string queryString) 
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand( queryString, connection);
        adapter.Fill(dataset);
        return dataset;
    }
}

在代码中,这一行显然被注释掉了://rdr.Close();它没有任何区别。我尝试过使用那一行。仍然是相同的错误。为什么要在第二个“if”语句的第一行中重新创建相同的连接?如果不使用该rdr变量(SqlDataReader rdr=cmd.ExecuteReader();),为什么要使用它?请编辑我的代码并告诉我您到底在说什么。我还在想办法。