Чтение SqlDataReader при закрытом соединении
От: Аноним  
Дата: 28.09.10 07:52
Оценка:
У меня есть куча процедур, которые читают что-то из базы данных посредством объекта SqlDataReader.

        public void Foo()
        {
            SqlConnection conn = new SqlConnection("bla-bla-bla");

            SqlCommand cmd = new SqlCommand("Stored_procedure", conn);

            conn.Open();

            SqlDataReader rdr = cmd.ExecuteReader();

            // чтение из ридера

            conn.Close();
        }


Вопрос: можно ли производиь чтение при закрытом соединении, то есть сначала вызвать
conn.Close

а затем произвести чтение ? Если нет, то подскажите механизм как получить данные после закрытия соединения ? Получается что ExecuteReader хранит результаты на сервере, а не закачивает их мне. А мне нужно чтобы данные закачались и я мог закрыть соединение. Как ?
Re: Чтение SqlDataReader при закрытом соединении
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 28.09.10 07:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня есть куча процедур, которые читают что-то из базы данных посредством объекта SqlDataReader.


А>
А>        public void Foo()
А>        {
А>            SqlConnection conn = new SqlConnection("bla-bla-bla");

А>            SqlCommand cmd = new SqlCommand("Stored_procedure", conn);

А>            conn.Open();

А>            SqlDataReader rdr = cmd.ExecuteReader();

А>            // чтение из ридера

А>            conn.Close();
А>        }
А>


А>Вопрос: можно ли производиь чтение при закрытом соединении, то есть сначала вызвать

А>
А>conn.Close
А>

А>а затем произвести чтение ? Если нет, то подскажите механизм как получить данные после закрытия соединения ? Получается что ExecuteReader хранит результаты на сервере, а не закачивает их мне. А мне нужно чтобы данные закачались и я мог закрыть соединение. Как ?

Ну пробегись по нему, они и закачаются А коннект нужен обязательно
Re[2]: Чтение SqlDataReader при закрытом соединении
От: Аноним  
Дата: 28.09.10 08:00
Оценка:
Здравствуйте, alexey.kostylev, Вы писали:

AK>Ну пробегись по нему, они и закачаются А коннект нужен обязательно


В том то и дело, что "бегать" не хочу. Хочу получить данные и закрыть соединение. А "бегать" уже после. Если есть такая возможность, то как реализовать ?
Re: Чтение SqlDataReader при закрытом соединении
От: Lloyd Россия  
Дата: 28.09.10 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а затем произвести чтение ? Если нет, то подскажите механизм как получить данные после закрытия соединения ? Получается что ExecuteReader хранит результаты на сервере, а не закачивает их мне. А мне нужно чтобы данные закачались и я мог закрыть соединение. Как ?


DataReader как раз и нужен, чтобы закачать данные.
Re[3]: Чтение SqlDataReader при закрытом соединении
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 28.09.10 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, alexey.kostylev, Вы писали:


AK>>Ну пробегись по нему, они и закачаются А коннект нужен обязательно


А>В том то и дело, что "бегать" не хочу. Хочу получить данные и закрыть соединение. А "бегать" уже после. Если есть такая возможность, то как реализовать ?


а чтобы получить данные надо пробежаться Ты же когда курсор открываешь бегаешь же по нему, а не закрываешь сразу. SqlDataAdapter попробуй
Re[3]: Чтение SqlDataReader при закрытом соединении
От: Lloyd Россия  
Дата: 28.09.10 08:02
Оценка: +1
Здравствуйте, Аноним, Вы писали:

AK>>Ну пробегись по нему, они и закачаются А коннект нужен обязательно


А>В том то и дело, что "бегать" не хочу. Хочу получить данные и закрыть соединение. А "бегать" уже после. Если есть такая возможность, то как реализовать ?


Закачать в список объектов, потом бегать уже по списку.
Re: Чтение SqlDataReader при закрытом соединении
От: Александр Кузнецов Россия  
Дата: 28.09.10 08:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос: можно ли производиь чтение при закрытом соединении, то есть сначала вызвать

А>
А>conn.Close
А>

А>а затем произвести чтение ? Если нет, то подскажите механизм как получить данные после закрытия соединения ? Получается что ExecuteReader хранит результаты на сервере, а не закачивает их мне. А мне нужно чтобы данные закачались и я мог закрыть соединение. Как ?

Использование DataReader подразумевает, что мы читаем данные из базы каждый раз, как вызываем метод Read. Естественно, соединение при этом должно быть открытым. Так что читать DataReader при закрытом соединении нельзя никак, увы.
Варианты решения:
1. Использовать отсоединенную модель (классы DataSet, DataTable, DataAdapter и т.д.). В ней данные сперва протягиваются на сторону клиента, а затем с ними можно делать что угодно при разорванном соединении. В приложениях с минимальным набором бизнес-логики и отсутствием сервисов этого более чем достаточно.
2. Создать собственные сущностные классы, и написать методы, которые будут читать данные через DataReader из базы и создать колекции объектов этих классов. Потом можно разрывать соединение и работать с коллекциями так, как будет удобно.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: Чтение SqlDataReader при закрытом соединении
От: Tom Россия http://www.RSDN.ru
Дата: 28.09.10 08:17
Оценка: +1
А> Как ?
Загрузить данные в DataTable и вернуть reader вызвав CreateDataReader
Народная мудрось
всем все никому ничего(с).
Re[2]: Чтение SqlDataReader при закрытом соединении
От: Аноним  
Дата: 28.09.10 08:35
Оценка:
Здравствуйте, Александр Кузнецов, Вы писали:

Будет ли вариант чтения c закачкой в DataTable быстрее (медленнее), чем при использованнии SqlDataReader ? Объем получаемых данных из базы при этом не велик: до 400 записей и от 1 до 8 столбцов.
Re[3]: Чтение SqlDataReader при закрытом соединении
От: Александр Кузнецов Россия  
Дата: 28.09.10 08:46
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Александр Кузнецов, Вы писали:


А>Будет ли вариант чтения c закачкой в DataTable быстрее (медленнее), чем при использованнии SqlDataReader ? Объем получаемых данных из базы при этом не велик: до 400 записей и от 1 до 8 столбцов.


А взять и написать программу проверки?
SqlDataReader будет быстрее, т.к., при работе с ним компьютеру не приходится создавать дополнительную обвязку в виде строк с возможностью отмены действий, столбцов и прочего (подразумевается, что сущностные классы, в которые сохраняются результаты SqlDataReader, будут простыми).
Но важно помнить одну вещь: на 400 записях и 8 столбцах разницу в скорости работы вы все равно не почувствуете. Разница между 5-6 миллисекунд и 10-15 миллисекунд (цифры взяты с потолка) визуально заметна не будет
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re[2]: Чтение SqlDataReader при закрытом соединении
От: Аноним  
Дата: 28.09.10 08:59
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Загрузить данные в DataTable и вернуть reader вызвав CreateDataReader


Пока тоже склоняюсь к использованию DataTable вместо SqlDataReader. Даже не знал, что у DataTable есть метод CreateDataReader. Надо попробовать.

А вот метод Load у DataTable — он ведь грузит данные уже на компьютер, верно? после его вызова соединение можно закрыть ?
Re[3]: Чтение SqlDataReader при закрытом соединении
От: Tom Россия http://www.RSDN.ru
Дата: 28.09.10 09:33
Оценка:
А>А вот метод Load у DataTable — он ведь грузит данные уже на компьютер, верно? после его вызова соединение можно закрыть ?
Верно
Народная мудрось
всем все никому ничего(с).
Re: Чтение SqlDataReader при закрытом соединении
От: eraservsv  
Дата: 28.09.10 13:46
Оценка:
Для таких объемов используите DataAdapter. Пример для OleDb:
DataTable dt = new DataTable();
using(OleDbConnection conn = new OleDbConnection(connectionString))
{
using(OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM MY_TABLE",conn))
{
da.Fill(dt);
}
}
Re[2]: Чтение SqlDataReader при закрытом соединении
От: Lloyd Россия  
Дата: 28.09.10 14:13
Оценка:
Здравствуйте, eraservsv, Вы писали:

E>Для таких объемов используите DataAdapter.


Для каких "таких"?
Re[3]: Чтение SqlDataReader при закрытом соединении
От: eraservsv  
Дата: 29.09.10 15:01
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, eraservsv, Вы писали:


E>>Для таких объемов используите DataAdapter.


L>Для каких "таких"?


Высше автор темы писал: Объем получаемых данных из базы при этом не велик: до 400 записей и от 1 до 8 столбцов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.