SqlDataReader внутри SqlDataReader

Как я могу реализовать SqlDataReader внутри другого SqlDataReader?

Моя проблема в том, что у меня есть SqlDataReader. Я выдаю while (reader.read()) и внутри цикла while мне нужно создать еще один SqlDataReader для чтения из базы данных. Но я получаю исключения о том, что соединение уже открыто.

Итак, как лучше всего решить мою проблему?

Редактировать:

Я использую clr для создания своих хранимых процедур. Я попытался поместить MultipleActiveResultSets=true; в строку подключения как clr, так и проекта, и возникло исключение, когда я тестировал свою хранимую процедуру на SQL Server:

System.InvalidOperationException: уже существует открытый DataReader, связанный с этой командой, который необходимо сначала закрыть.


person scatman    schedule 01.03.2010    source источник
comment
Вы используете то же соединение с предыдущим SqlDataReader? Пробовали создать новый?   -  person Thanos Papathanasiou    schedule 01.03.2010
comment
Да, конечно. я пытался создать новый, дело в том, что я использую clr, он работает при развертывании, но когда я использую хранимую процедуру в своем приложении, возникает исключение...   -  person scatman    schedule 01.03.2010


Ответы (2)


Вам необходимо иметь два вложенных средства чтения данных, и для этого требуется функция ADO.NET "MARS" — несколько активных наборов результатов.

Это доступно, начиная с ADO.NET 2.0, и требует определенного параметра (MultipleActiveResultSets=true;) в строке подключения:

Server=.\SQLEXPRESS;Database=master;Integrated Security=SSPI;
  MultipleActiveResultSets=true;

См. этот запись в блоге за отличное обсуждение.

Как только вы это сделаете, вы сможете использовать более одного SqlDataReader в одном и том же SqlConnection в своем коде и использовать их независимо друг от друга.

ОБНОВЛЕНИЕ: этот сообщение в блоге здесь упоминает, что функция MARS недоступна в среде SQL CLR :-( Так что это не будет работать внутри хранимой процедуры SQL CLR....

person marc_s    schedule 01.03.2010
comment
да, определенно должен (если они используют одно и то же соединение, например, идентичную строку соединения — идентичную до последней запятой и пробела!) - person marc_s; 01.03.2010
comment
ну, это не сработало при использовании clr. после того, как я создал свою хранимую процедуру, я попытался протестировать ее на MS-SQL, и произошло исключение, в котором говорилось, что: System.InvalidOperationException: уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт в первую очередь. - person scatman; 02.03.2010
comment
@scatman: да, к сожалению, похоже, это не поддерживается - смотрите мое обновление..... извините - person marc_s; 02.03.2010

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

Вы можете использовать MultipleActiveResultsets, при этом из . NET 2.0 и SQL Server 2005 и более поздних версий, вы можете указать дополнительный параметр в строке подключения, чтобы включить несколько активных наборов результатов для одного подключения к базе данных, добавив:

MultipleActiveResultSets=True;

Альтернативой является использование другого подключения для открытия внутреннего считывателя данных.

Или даже можно переосмыслить свой первоначальный подход - может быть, есть способ сделать это без вложенных читателей.

person AdaTheDev    schedule 01.03.2010