打开与此命令关联的DataReader,必须先关闭它

时间:2013-08-15 15:14:43

标签: asp.net gridview

以下代码用于绑定网格:

protected void BindGrid()
{
    using (clsDt.sqlCnn)
    {
        clsDt.sqlCnn.Open();
        SqlCommand cmd = new SqlCommand("USP_CRUD_JWELORDERS", clsDt.sqlCnn);
        cmd.Parameters.Add(new SqlParameter("@operation", SqlDbType.VarChar, 20));
        cmd.Parameters["@operation"].Value = "Display";
        cmd.CommandType = CommandType.StoredProcedure;
        grdView.DataSource = cmd.ExecuteReader();
        grdView.DataBind();
        clsDt.sqlCnn.Close();
    }
}

以及以下用于绑定同一页面上的下拉列表:

protected void ddparticular(DropDownList ddlParticular)
{
    DataTable dt = new DataTable();
    ddlParticular.DataSource = clsDt.getDataTable("SELECT COM_CMCD,COM_CMNM FROM COM_MST WHERE COM_CMCD = (SELECT COM_CMCD FROM COM_TYP WHERE COM_CTNM = 'Jewellery')");
    ddlParticular.DataTextField = "COM_CMNM";
    ddlParticular.DataValueField = "COM_CMCD";
    ddlParticular.DataBind();
}

但运行时显示:

已经有一个与此命令关联的开放DataReader,必须先关闭

1 个答案:

答案 0 :(得分:1)

我唯一可以直接看到的是将网格视图绑定到数据读取器,我不确定它是否可行(您必须调用reader.Read()来获取行),它可能永远不会实际读取,并且从不关闭连接,因为读者没有完成(我可能错了)。

出于兴趣,请尝试将其替换为:

grdView.DataSource = cmd.ExecuteReader();
grdView.DataBind();

使用:

var dt = new DataTable();
var reader = cmd.ExecuteReader();
dt.Load(reader);
grdView.DataSource = dt;
grdView.DataBind();

我遇到了一些与网格视图绑定的数据绑定器的公平问题,这是我现在通常采用的方式。