Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

SqlDataReader - проблемы со считыванием данных

242
21 февраля 2011 года
Оlga
2.2K / / 04.02.2006
Мне надо считать данные с БД. Использую для этого, или точнее пытаюсь использовать, SqlDataReader. Вот пример функции:

Код:
public string ReadRecord(string sql)
        {
            string conStr = ConfigurationManager.ConnectionStrings[this.nameConnection].ConnectionString;
            string record = null;

            using (SqlConnection connection =
                       new SqlConnection(conStr))
            {
                SqlCommand command =
                    new SqlCommand("select * from Persons", connection);
                connection.Open();

                SqlDataReader reader = command.ExecuteReader();

                // Call Read before accessing data.
                while (reader.Read())
                {
                    record = reader[1].ToString() + " " + reader[2].ToString() + " " + reader[3].ToString() + " ";
                }

                // Call Close when done reading.
                reader.Close();
            }

            return record;
        }
текст запроса:
sql = "Select * from Persons"

как можно увидеть из вложения, то после выполнение функции ExecuteReader(), получаем ридер, который содержит в себе все поля таблицы Персонс, но на следующем шаге, проходила в дебагере не один раз, получаю "Перечесление не выдало результатов", т.е. в цикл while даже не заходим.

изначальная цель была: обратиться к классу, включающему стандартный набор функций для работы с БД (класс получила в наследство от преподавателя, действующий программист, они им на работе пользуются... он его дал в классе для самостоятельной проработки ...), и получить ридер, который должен был включать в себя одну результатирующую строку, так запрос был построен, а уже в другой функции я должна была вытащить эту строку, отправить ее куда нужно, ридер и коннекшн к БД закрыть и все это с успехом не работает, ситуация анологична выше изложенной.

вот у меня и вопрос, сама не дохожу, когда это у меня в ридере вся инфа прокручивается, что уже на следующем шаге после его получения, с него ничего считать нельзя? пример выше написала по аналогу в мсдн:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(VS.90).aspx?appId=Dev10IDEF1&l=RU-RU&k=k(MICROSOFT.VISUALSTUDIO.LINQSQLDESIGNER.CUSTOMDATABASEPROVIDERDIALOG);k(TargetFrameworkMoniker-

[COLOR=red]Ответ:[/COLOR] для показа списочка в режиме отладки, смотрим первый вложенный рисунок, с ридера все считывается, а когда доходим до следующего шага, цикл while, получаем облом - по ридеру уже один раз прошлись, для считывания данных в просмотре режима отладки, и уже читать нечего => не пользуйтесь дебагером для просмотра ридера или по крайней мере понимайте, чем это для вас закончиться и не тормозите :D
242
21 февраля 2011 года
Оlga
2.2K / / 04.02.2006
Обнаружила сейчас интересный факт, проблемы начинаются только в режиме отладки, т.е. когда я просматриваю пошагово работу кода, а не просто запускаю в режиме отладки, а без отладки все сейчас работает гуд, во всяком случае вышеприведенный код работает, другой вариант еще проверю. Такие вот чудеса техники )

Еще вопрос, если кто нибудь ответит конечно :-) У меня возникала следующая проблема:
Есть класс по работе с БД. Для каждой операции в БД создается подключение, делается операция, по запросу пользователя, и подключение с базой закрывается: SqlConnection.Close (or Dispose). Если вскоре после этих событий, скажем считанные минуты, опять происходит запрос к БД, опять открывается соединение с БД и тут начинались проблемы, т.к. в классе по работе с БД перед тем как создать соединение (мембер на уровне класса, т.е. доступный для всех функций), проверялось что данное соединение равно null значению, а оно не равнялось, несмотря на выполненный ранее метод Закрыть соединение, т.е. я так поняла просто оставался мусор в переменной, сборщик мусора ее просто не успевал почистить и начинались проблемы, которые я решила тем, что после закрытия подсоединения я просто задаю нулл значение переменной СклКоннекшн.
Вопрос: насколько это вообще правильный подход. Сама функция закрытия подсоединения:
 
Код:
public void CloseConnection()
        {
            if (this.sqlConnection != null)
            {
                this.sqlConnection.Close();
                this.sqlConnection = null;
            }
        }
5
21 февраля 2011 года
hardcase
4.5K / / 09.08.2005
Я думаю что проблема в отладке с тем, что ридер может прочитать данные лишь один раз.
Я бы для работы с SQLServer выбирал между EntityFramework, BLToolkit и LinqToSql - уж очень мне лениво писать SqlCommand-ы и вручную работать с ADO-примитивами.
5
21 февраля 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Оlga
Вопрос: насколько это вообще правильный подход. Сама функция закрытия подсоединения:
 
Код:
public void CloseConnection()
        {
            if (this.sqlConnection != null)
            {
                this.sqlConnection.Close();
                this.sqlConnection = null;
            }
        }


В серверных системах логическое соединение нужно закрывать сразу же. Т.е. код должен быть вида:

 
Код:
using(var connection = new SqlConnection(...)) // либо нечто, что инкапсулирует подключение
{
...
}


Физическим соединением будет заниматься подсистема пула соединений ADO.NET.
242
21 февраля 2011 года
Оlga
2.2K / / 04.02.2006
Цитата: hardcase
Я думаю что проблема в отладке с тем, что ридер может прочитать данные лишь один раз.
Я бы для работы с SQLServer выбирал между EntityFramework, BLToolkit и LinqToSql - уж очень мне лениво писать SqlCommand-ы и вручную работать с ADO-примитивами.


тут вопрос учебы, знать надо если не все, то хотя бы основные вещи, т.е. датасет, ридеры и т.д. никто не отменил, чем и занимаюсь. с EntityFramework еще не знакома, предстоит, , LinqToSql в процессе, но насколько я *поняла* - это оболочка над оболочкой, т.е. еще один дополнительный слой, который возможно и упрощает жизнь программиста, но замедляет работу программы, отлаживать такую программу, слышала мнение, тоже не легко, если проблемы выявляются через N кол-во месяцев. BLToolkit - вообще пока не в теме, тут бы хотя бы с АДО.НЕТ и вышеупомяннутыми 2-мя технологиями разобраться. У меня вообще весело, не знаешь что раньше учить. Я когда смотрю на требования к Си шарп программисту - меня зашкаливает :)

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

242
21 февраля 2011 года
Оlga
2.2K / / 04.02.2006
Цитата: hardcase
В серверных системах логическое соединение нужно закрывать сразу же. Т.е. код должен быть вида:
 
Код:
using(var connection = new SqlConnection(...)) // либо нечто, что инкапсулирует подключение
{
...
}
Физическим соединением будет заниматься подсистема пула соединений ADO.NET.



в общем я согласна, хотя бы с точки зрения того что советует сам майкрософт в своей справке. как я упомянула выше, мой преподователь(я на кое каких курсах учусь по программированию), дал нам готовый класс как образец нам деткам, как писать надо: берите пользуйтесь. я к нему ничего не имею, он в пронципе действительно хороший, но такая у них там схема, отдельный метод для откррытия коннекшна и отдельный для закрытия, видно чтобы не писать 10 раз блок юсинг, не смотря на все уговоры майкрософт. если пользоваться приведенной тобой схемой, то конечно проблем не будет. у них проблем тоже нет, он говорит что они уже годами этим классом пользуются, а у меня вот такая проблема выскочила. постараюсь найти время и задать ему вопрос.

а смысл моего вопроса по данной теме был в том, нет ли подводных камней в моем решении проблемы?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог