Неверная попытка вызвать 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();
                    }
                }

            }
        }

person JTRookie86    schedule 20.12.2011    source источник
comment
Ваш оператор использования закроет соединение для получения дополнительной информации, проверьте этот поток, он может ответить на ваш вопрос stackoverflow.com/questions/5516914/   -  person rs.    schedule 20.12.2011
comment
Та же ошибка в другом сценарии stackoverflow.com/questions/6775136/   -  person LCJ    schedule 20.11.2012


Ответы (2)


Вы не можете использовать 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;
            }

        }
    }
person pseudocoder    schedule 20.12.2011
comment
Спасибо, Псевдокодер и Майк! Ваш совет очень помог, и мой код теперь работает. :) - person JTRookie86; 21.12.2011
comment
@user1108273 user1108273 С удовольствием :) Не забудьте принять ответ, если считаете, что ваша проблема решена. - person pseudocoder; 21.12.2011

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

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

person Mike Hofer    schedule 20.12.2011