SqlDataReader - проблемы со считыванием данных
{
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
Еще вопрос, если кто нибудь ответит конечно :-) У меня возникала следующая проблема:
Есть класс по работе с БД. Для каждой операции в БД создается подключение, делается операция, по запросу пользователя, и подключение с базой закрывается: SqlConnection.Close (or Dispose). Если вскоре после этих событий, скажем считанные минуты, опять происходит запрос к БД, опять открывается соединение с БД и тут начинались проблемы, т.к. в классе по работе с БД перед тем как создать соединение (мембер на уровне класса, т.е. доступный для всех функций), проверялось что данное соединение равно null значению, а оно не равнялось, несмотря на выполненный ранее метод Закрыть соединение, т.е. я так поняла просто оставался мусор в переменной, сборщик мусора ее просто не успевал почистить и начинались проблемы, которые я решила тем, что после закрытия подсоединения я просто задаю нулл значение переменной СклКоннекшн.
Вопрос: насколько это вообще правильный подход. Сама функция закрытия подсоединения:
{
if (this.sqlConnection != null)
{
this.sqlConnection.Close();
this.sqlConnection = null;
}
}
Я бы для работы с SQLServer выбирал между EntityFramework, BLToolkit и LinqToSql - уж очень мне лениво писать SqlCommand-ы и вручную работать с ADO-примитивами.
{
if (this.sqlConnection != null)
{
this.sqlConnection.Close();
this.sqlConnection = null;
}
}
В серверных системах логическое соединение нужно закрывать сразу же. Т.е. код должен быть вида:
{
...
}
Физическим соединением будет заниматься подсистема пула соединений ADO.NET.
Я бы для работы с SQLServer выбирал между EntityFramework, BLToolkit и LinqToSql - уж очень мне лениво писать SqlCommand-ы и вручную работать с ADO-примитивами.
тут вопрос учебы, знать надо если не все, то хотя бы основные вещи, т.е. датасет, ридеры и т.д. никто не отменил, чем и занимаюсь. с EntityFramework еще не знакома, предстоит, , LinqToSql в процессе, но насколько я *поняла* - это оболочка над оболочкой, т.е. еще один дополнительный слой, который возможно и упрощает жизнь программиста, но замедляет работу программы, отлаживать такую программу, слышала мнение, тоже не легко, если проблемы выявляются через N кол-во месяцев. BLToolkit - вообще пока не в теме, тут бы хотя бы с АДО.НЕТ и вышеупомяннутыми 2-мя технологиями разобраться. У меня вообще весело, не знаешь что раньше учить. Я когда смотрю на требования к Си шарп программисту - меня зашкаливает :)
да, а насчет того что ридер проход делает всего раз - это я поняла, проблема в том, что я не понимаю, как же эта родная система отладки работает, что она мне такой подарок подкинула и съела за меня право считать полученные данные и в мсдн никаких предупреждений, хотя бы для таких гениев как я )
{
...
}
в общем я согласна, хотя бы с точки зрения того что советует сам майкрософт в своей справке. как я упомянула выше, мой преподователь(я на кое каких курсах учусь по программированию), дал нам готовый класс как образец нам деткам, как писать надо: берите пользуйтесь. я к нему ничего не имею, он в пронципе действительно хороший, но такая у них там схема, отдельный метод для откррытия коннекшна и отдельный для закрытия, видно чтобы не писать 10 раз блок юсинг, не смотря на все уговоры майкрософт. если пользоваться приведенной тобой схемой, то конечно проблем не будет. у них проблем тоже нет, он говорит что они уже годами этим классом пользуются, а у меня вот такая проблема выскочила. постараюсь найти время и задать ему вопрос.
а смысл моего вопроса по данной теме был в том, нет ли подводных камней в моем решении проблемы?