2010-03-01 3 views
9

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

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

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

Edit:

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

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

+0

Вы используете то же соединение с предыдущим SqlDataReader? Вы пробовали создать новый? –

+0

да конечно. я пытался создать новый, дело в том, что я использую clr, он работает, когда я развертываю, но когда я использую хранимую процедуру в своем приложении, возникает excepion ... – scatman

ответ

18

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

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

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

Посмотреть этот blog post для отличной дискуссии.

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

UPDATE: это blog post here упоминает, что функция MARS не доступна в среде SQL CLR :-(, так что не будет работать внутри SQL CLR хранимая процедура ....

+0

это тоже работает, если я использую clr и сохраняю процедуры? – scatman

+0

Да, это определенно должно (пока они используют одно и то же соединение, например, ** идентичную строку соединения **, идентичную до последней запятой и пробелам!) –

+0

хорошо, что это не сработало при использовании clr. после того, как я создал свою хранимую процедуру, я попытался протестировать ее на MS-SQL, и появилось сообщение, в котором указано, что: System.InvalidOperationException: уже открыт DataReader, связанный с этой командой, который должен быть закрыт первым. – scatman

5

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

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

MultipleActiveResultSets=True; 

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

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

Смежные вопросы