GridView 行已创建:在读取器关闭时调用字段计数的尝试无效



当使用空数据集创建网格视图时,我收到此错误。我正在尝试做的是在空数据模板中填充一个下拉列表。从阅读其他帖子中,错误是由在SqlConnection obejct关闭后使用SqlDataReader绑定网格视图引起的。但是,填充网格视图行后,行不会创建火灾吗?

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.EmptyDataRow)
    {
        string connectionString3 = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
        DropDownList ddl = (DropDownList)e.Row.FindControl("EOCEmpty");
        using (SqlConnection conn3 = new SqlConnection(connectionString3))
        {
            SqlCommand cmd3 = new SqlCommand("SELECT DISTINCT GLAccountEOC, EOCDescription FROM Acct_GLAccount WHERE CostCenter = @CostCenter Order By EOCDescription", conn3);
            cmd3.Parameters.Add("@CostCenter", System.Data.SqlDbType.Int);
            cmd3.Parameters["@CostCenter"].Value = "3215";
            try
            {
                conn3.Open();
                SqlDataReader cmdreader3 = cmd3.ExecuteReader();
                ddl.DataSource = cmdreader3;
                ddl.DataValueField = "GLAccountEOC";
                ddl.DataTextField = "EOCDescription";
                ddl.DataBind();
                cmdreader3.Close();
            }
            finally
            {
                conn3.Close();
            }
        }
    }
}

问题似乎出现在以下行中:

SqlDataReader cmdreader3 = cmd3.ExecuteReader();
ddl.DataSource = cmdreader3;

您应该知道,ExecuteReader()方法构建SqlDataReader实例(即只进流),并且在尝试访问读取器时连接似乎已关闭。请考虑使用SqlDataReader.Read()方法打开读取器并前进到第一个记录,或者将内容加载到内存中DataSet/DataTable中,并将其用作 GridView 的数据源。

下面是在DataTable中加载SqlDataReader内容的示例:

var dt = new DataTable();
using (SqlConnection conn3 = new SqlConnection(connectionString3))
{
    SqlCommand cmd3 = new SqlCommand("SELECT DISTINCT GLAccountEOC, EOCDescription FROM Acct_GLAccount WHERE CostCenter = @CostCenter Order By EOCDescription", conn3);
    cmd3.Parameters.Add("@CostCenter", System.Data.SqlDbType.Int);
    cmd3.Parameters["@CostCenter"].Value = "3215";
    try
    {
        conn3.Open();
        SqlDataReader cmdreader3 = cmd3.ExecuteReader();
        if (cmdreader3.HasRows)
        {
            dt.Load(cmdreader3);
            ddl.DataSource = dt; // use DataTable instead of SqlDataReader
            ddl.DataValueField = "GLAccountEOC";
            ddl.DataTextField = "EOCDescription";
            ddl.DataBind();
        }
        cmdreader3.Close();
    }
    finally
    {
        conn3.Close();
    }
}

如果问题仍然存在,请使用RowDataBound事件处理程序而不是RowCreated来填充下拉列表值(请参阅 RowCreated 和 RowDataBound 事件之间的差异)。

类似问题:

asp.net 读取器关闭时无效尝试字段计数错误

最新更新