Как я могу реализовать a SqlDataReader
в другом SqlDataReader
?
Моя проблема, у меня есть a SqlDataReader
. Я выхожу while (reader.read())
и в цикле с условием продолжения я должен создать другого SqlDataReader
читать из базы данных. Но я получаю исключения о соединении уже, являющемся открытым.
Таким образом, что лучший способ состоит в том, чтобы решить мою проблему?
Править:
Я использую сброс для создания моих хранимых процедур. Я пытался поместить MultipleActiveResultSets=true;
в рамках строки подключения и сброса и проекта и исключения произошел, когда я протестировал свою хранимую процедуру на SQL Server:
Система. InvalidOperationException: уже существует открыть DataReader, связанный с этой Командой, которая должна быть закрыта сначала.
Вам необходимо иметь два вложенных считывателя данных, а для этого требуется функция «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 ....
Проблема, с которой вы столкнулись, заключается в том, что вы пытаетесь открыть несколько устройств чтения данных для одного и того же соединения с базой данных. По умолчанию это приведет к исключению, так как будет сказано, что оно уже связано с подключением - как вы видели.
Вы можете использовать MultipleActiveResultsets , при этом начиная с .NET 2.0 и SQL Server 2005 и далее вы можете указать дополнительную опцию в строке подключения, чтобы включить несколько активных наборов результатов для одного соединения с базой данных, добавив:
MultipleActiveResultSets=True;
Альтернативой является использование другого соединения для открытия внутреннего считывателя данных.
Или даже, возможно, удастся переосмыслить ваш исходный подход - возможно, есть способ сделать это без вложенных читателей.