Неправильная попытка вызова Read, когда читатель закрыт - PullRequest
1 голос
/ 20 декабря 2011

Я пытаюсь заставить эту сетку данных связываться.Каждый раз, когда я запускаю свой код, я получаю сообщение об ошибке «Недопустимая попытка вызвать Read, когда читатель закрыт».Я не вижу, где я закрываю своего читателя.Не могли бы вы мне помочь?Мой код для загрузки сетки данных ниже:

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 ]

2 голосов
/ 20 декабря 2011

Вы не можете использовать SqlDataReader в качестве источника данных для DataGrid.

Из 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

Обычная методология для привязки результатов запроса к вашей сетке данных состоит в том, чтобы использовать 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 голос
/ 20 декабря 2011

В дополнение к тому, что сказал псевдокодер, вы не захотите связываться с SqlDataReader в любом случае: соединение с базой данных будет оставаться открытым, пока существует экземпляр считывателя.

Вы определенно хотите десериализоватьданные в какую-то другую несвязанную структуру данных, чтобы вы как можно быстрее освободили соединение обратно в пул.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...