SqlDataReader в SqlDataReader

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

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

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

Править:

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

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

11
задан marc_s 14 January 2014 в 08:40
поделиться

2 ответа

Вам необходимо иметь два вложенных считывателя данных, а для этого требуется функция «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 ....

18
ответ дан 3 December 2019 в 04:52
поделиться

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

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

MultipleActiveResultSets=True;

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

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

5
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: