SqlDataReader внутри SqlDataReader - PullRequest
11 голосов
/ 01 марта 2010

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

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

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

Edit:

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

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

Ответы [ 2 ]

18 голосов
/ 01 марта 2010

У вас должно быть два вложенных считывателя данных, а для этого требуется функция «MARS» ADO.NET - несколько активных наборов результатов.

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

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

Смотрите это сообщение в блоге для отличного обсуждения.

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

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

5 голосов
/ 01 марта 2010

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

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

MultipleActiveResultSets=True;

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

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

...