Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как из метода вернуть SqlDataReader, можно ли, и как сделать эффективно? 
V
    Опции темы
ДобренькийПапаша
Дата 13.8.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Есть такой код:

Код

{
SqlDataReader myReaderForPass =
                (SqlDataReader)
                ProcInvoke.ExecuteQuery("AuthSecur", QueryType.ExecuteReader, CommandType.StoredProcedure,
                                        new ProcParams("@Login", SqlDbType.VarChar, 50, username,
                                                       ParameterDirection.Input));
//Сдесь делаю myReaderForPass.Read АН НЕТ! ОШИБКА! myReaderForPass ЗАКРЫТ!
}

public static object ExecuteQuery(string procName, QueryType queryType, 
            CommandType cmdType, params ProcParams[] ex)
        {
            using (SqlConnection curConnect = ProcInvoke.GetDBConnection(ProcInvoke.ServerPath,
                                                                         ProcInvoke.DataBasePath))
            {
                try
                {
                    curConnect.Open();

                    SqlCommand curCommand = new SqlCommand(procName, curConnect);
                    curCommand.CommandType = cmdType;

                    if (ex != null)
                    {
                        curCommand.Parameters.AddRange(ProcInvoke.GetParameter(ex));
                    }
                   
                    switch (queryType)
                    {
                        case QueryType.ExecuteReader:
                            {
                                SqlDataReader curReader = curCommand.ExecuteReader();
                                curConnect.Close();
                              
                                //SqlContext.Pipe.Send(curReader);                     //Как вернуть SqlDataReader
                                return curReader;
                                //break;
                            }
                       
                   }
                }
                catch(SqlException curEx)
                {
                    MessageBox.Show(curEx.Message, curEx.Source);
                    return null;
                }
            }
        }


Здесь функция возвращает тип object так что при возврате SqlDataReader происходит неявное приведение типа, я так понял, это и закрывает объект DataReader, и я не могу дальше читать данные...

Как вернуть объект грамотно, нашёл инфу про SqlPipe в MSDN. По описанию вроде SqlPipe должен решать проблем, но описание какое-то скудное и я не пойму куда конкретно с помощью Pipe можно вернуть результаты.

Как сделать грамотно вобщем, вот вопрос?  


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Idsa
Дата 13.8.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(ДобренькийПапаша @  13.8.2009,  15:24 Найти цитируемый пост)
Здесь функция возвращает тип object так что при возврате SqlDataReader происходит неявное приведение типа, я так понял, это и закрывает объект DataReader

Нет, приведение типов здесь ни при чем.

Цитата(ДобренькийПапаша @  13.8.2009,  15:24 Найти цитируемый пост)
и я не могу дальше читать данные...

В чем это выражается?

P. S. Взгляните в сторону ORM.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mihryak
Дата 13.8.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(ДобренькийПапаша @  13.8.2009,  12:24 Найти цитируемый пост)
curConnect.Close();

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

вполне нормально вызвращать ридер из метода с обязательством закрыть его после использования
твой код не позволит это сделать нормально, придётся немного изменить
выглядеть всё может примерно так
Код

using (DbConnection connection = CreateConnection())
using (DbDataReader reader = GetDataReader(connection, query, parameters))
{
       var data = ReadObject(reader);
}



Это сообщение отредактировал(а) mihryak - 13.8.2009, 11:49
PM MAIL ICQ   Вверх
ДобренькийПапаша
Дата 13.8.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



1)Вы имеете ввиду что надо убрать using и все вызовы Close() из метода ExecuteQuery и обернуть в using сам вызов метода, чтобы была возможность работать с DataReader пока соединение не закрыто?

2)Насчёт ORM, может мне прям здесь в методе ExecureReader() просто перелить DataReader в массив объектов?
(ресурсо-затратное это дело, конечно...)

Добавлено @ 12:13
 
Код

using (SqlDataReader myReaderForPass =
                 (SqlDataReader)
                 ProcInvoke.ExecuteQuery("AuthSecur", QueryType.ExecuteReader, CommandType.StoredProcedure,
                                         new ProcParams("@Login", SqlDbType.VarChar, 50, username,
                                                        ParameterDirection.Input)))
            {
            }

public static object ExecuteQuery(string procName, QueryType queryType, 
            CommandType cmdType, params ProcParams[] ex)
        {
            //using (SqlConnection curConnect = ProcInvoke.GetDBConnection(ProcInvoke.ServerPath,
            //                                                             ProcInvoke.DataBasePath))
            //
            SqlConnection curConnect = ProcInvoke.GetDBConnection(ProcInvoke.ServerPath,
                                                                  ProcInvoke.DataBasePath);
            }


Обёртка в using вызываемого метода обеспечивает закрытие коннекта, открываемого в вызываемом методе?

Это сообщение отредактировал(а) ДобренькийПапаша - 13.8.2009, 12:14


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
ДобренькийПапаша
Дата 13.8.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



1)Вы имеете ввиду что надо убрать using и все вызовы Close() из метода ExecuteQuery и обернуть в using сам вызов метода, чтобы была возможность работать с DataReader пока соединение не закрыто?

2)Насчёт ORM, может мне прям здесь в методе ExecureReader() просто перелить DataReader в массив объекто?
(ресурсо-затратное это дело, конечно...)




КХМ, извиняюсь за непроизвольные повторы)))

Это сообщение отредактировал(а) ДобренькийПапаша - 13.8.2009, 12:06


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Bestoloch
  Дата 13.8.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 29.6.2009

Репутация: нет
Всего: нет



Я чтобы не мучить себя использую сборку Microsoft.ApplicationBlocks.Data

найти бинарник и исходники можно здесь

Это сообщение отредактировал(а) Bestoloch - 13.8.2009, 13:03
PM MAIL   Вверх
mihryak
Дата 13.8.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Цитата(ДобренькийПапаша @  13.8.2009,  13:05 Найти цитируемый пост)
Обёртка в using вызываемого метода обеспечивает закрытие коннекта, открываемого в вызываемом методе?

конечно же нет
посмотри на мой код внимательнее, порядок таков:
- в юзинге создаётся соединение
- вложенным юзингом создаётся ридер с использованием созданного соединение
- данные забираются из ридера
- ридер закрывается своим юзингом (вложенным)
- соединение закрывается своим юзингом
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.