Класс sqldatareader внутри объекта sqldatareader

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

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

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

Edit:

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

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, хранящегося proc....


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

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

MultipleActiveResultSets=True;

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

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