2010-03-01 19 views
9

¿Cómo puedo implementar un SqlDataReader dentro de otro SqlDataReader?SqlDataReader dentro de SqlDataReader

Mi problema es Tengo un SqlDataReader. Estoy emitiendo while (reader.read()) y dentro del ciclo while tengo que crear otro SqlDataReader para leer de la base de datos. Pero estoy recibiendo excepciones sobre la conexión que ya está abierta.

¿Cuál es la mejor manera de resolver mi problema?

Editar:

estoy usando CLR para crear mis procedimientos almacenados. He intentado poner MultipleActiveResultSets=true; dentro de la cadena de conexión, tanto de la CLR y el proyecto, y se produjo una excepción cuando a prueba mi procedimiento almacenado en SQL Server:

System.InvalidOperationException: Ya hay un DataReader abierto asociado con este Comando que debe cerrarse primero.

+0

¿Está utilizando la misma conexión con el SqlDataReader anterior? ¿Has intentado crear uno nuevo? –

+0

sí seguro. Traté de crear uno nuevo, la cosa es que estoy usando clr, funciona cuando lo despliego pero cuando uso el procedimiento almacenado en mi aplicación se produce una excepción ... – scatman

Respuesta

18

Necesita tener dos lectores de datos anidados, y esto requiere la función "MARS" de ADO.NET - Conjuntos de resultados activos múltiples.

Este servicio está disponible a partir de ADO.NET 2.0, y requiere un ajuste específico (MultipleActiveResultSets=true;) en la cadena de conexión:

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

ver este blog post Para una excelente discusión.

Una vez que tenga esto, debería poder tener más de un SqlDataReader compartido en el mismo en su código, y usarlos independientemente el uno del otro.

ACTUALIZACIÓN: este blog post here menciona que la característica MARS no está disponible en el entorno de SQL CLR :-(Así que no funciona dentro de un procedimiento almacenado de SQL CLR ....

+0

¿Esto también funciona si estoy usando clr y almacenado? procedimientos? – scatman

+0

sí, definitivamente debería (siempre que utilicen la misma conexión, por ejemplo, una cadena de conexión ** idéntica, idéntica a la última coma y espacio en blanco!) –

+0

bien, no funcionó cuando se usaba clr. después de crear mi procedimiento almacenado, traté de probarlo en MS-SQL y ocurrió una excepción que establecía que: System.InvalidOperationException: Ya hay un DataReader abierto asociado con este comando que debe cerrarse primero. – scatman

5

El problema que' El reencuentro es que está intentando abrir varios lectores de datos con la misma conexión de db. De forma predeterminada, esto le dará una excepción, ya que verá que ya hay uno asociado a la conexión, como ha visto.

Usted podría hacer uso de MultipleActiveResultsets, mediante el cual desde .NET 2.0 & SQL Server 2005 en adelante, puede especificar una operación adicional ción en la cadena de conexión para permitir que múltiples conjuntos de resultados activos contra una única conexión db mediante la adición de:

MultipleActiveResultSets=True; 

La alternativa es utilizar una conexión diferente para abrir el lector de datos interno en contra.

O incluso, puede ser posible volver a pensar su enfoque original - tal vez hay una manera de hacerlo sin lectores anidados.

Cuestiones relacionadas