Класс 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;
альтернативой является использование другого соединения для открытия внутреннего считывателя данных.
или даже, возможно, пересмотреть свой оригинальный подход - возможно, есть способ сделать это без вложенных читателей.