读取器关闭时无效尝试调用Read

时间:2011-12-20 16:29:26

标签: data-binding ado.net sqldatareader

我正在努力让这个数据网格绑定。每次我运行我的代码时,都会收到一条错误消息,指出“读取器关闭时无效尝试调用读取”。我不知道我在哪里关闭我的读者。你能帮我么?我加载数据网格的代码如下:

protected void LoadGrid()
        {
            using (SqlConnection conn = new SqlConnection())
            {
                conn.ConnectionString = ConfigurationManager.ConnectionStrings["VTC"].ConnectionString;
                conn.Open();


                string sql = "select * from roi_tracking";
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    using (SqlDataReader sqlReader = cmd.ExecuteReader())
                    {

                        gridROI.DataSource = sqlReader;
                        gridROI.DataBind();

                        sqlReader.Dispose();
                        cmd.Dispose();
                    }
                }

            }
        }

2 个答案:

答案 0 :(得分:2)

您不能将SqlDataReader用作DataGrid的DataSource。

来自MSDN:

  

数据源必须是实现其中一个的集合   System.Collections.IEnumerable接口(例如   System.Data.DataView,System.Collections.ArrayList或   System.Collections.Generic.List(Of T))或IListSource接口   绑定到从BaseDataList类派生的控件。

数据源属性: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.basedatalist.datasource.aspx

SqlDataReader的: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx

将查询结果绑定到datagrid的常用方法是使用SqlDataAdapter填充DataTable或DataSet,然后将其绑定到DataGrid.DataSource:

protected void LoadGrid()
    {
        using (SqlConnection conn = new SqlConnection())
        {
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["VTC"].ConnectionString;
            conn.Open();

            string sql = "select * from roi_tracking";
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = cmd;

                adapter.Fill((DataTable)results);
                gridROI.DataSource = results;
            }

        }
    }

答案 1 :(得分:1)

除了伪编码器所说的,你还不想绑定到SqlDataReader:只要读者实例存在,与数据库的连接就会保持打开状态。

您肯定希望将数据反序列化为其他一些断开连接的数据结构,以便尽快将连接释放回池中。