2009-04-12 13 views
6

He codificado tres declaraciones select en el procedimiento almacenado en Microsoft SQL Server 2005. Ambas sentencias select devuelven múltiples números de registros y lista de tablas para sentencias seleccionadas es diferente. Uno selecciona registros de una tabla maestra y el otro de una tabla secundaria. En el código C#, quiero obtener todos estos registros y poner todos los datos en un solo objeto. Estoy usando SqlDataReader. ¿Es posible con eso o debería hacer algo más?Cómo usar SqlDataReader si estoy teniendo más de una instrucción select en un procedimiento almacenado

Respuesta

17

Utiliza el método the NextResult en el lector de datos para navegar con resultados múltiples de una consulta.

para recorrer todos los datos que haría algo como esto:

var moreResults = true; 
while (moreResults) 
{ 
    while (reader.Read()) 
    { 
    ... 
    } 
    moreResults = reader.NextResult(); 
} 

Así que con eso como un fondo, y suponiendo que el conjunto de resultados principal viene primero, que pueblan maestra y detalle los objetos se puede hacer así:

en primer lugar, construir un diccionario de los registros maestros:

var masters = new Dictionary<int, Master>(); 

var idOrdinal = reader.GetOrdinal("id"); 
while (reader.Read()) 
{ 
    var id = reader.GetInt32(idOrdinal); 
    masters.Add(id, new Master{Id=id, ....}); 
} 

a continuación, pasar a los registros de detalles y añadir aquellos a su maestro correspondiente:

reader.NextResult(); 

var masterIdOrdinal = reader.GetOrdinal("masterId"); 
while (reader.Read()) 
{ 
    var masterId = reader.GetInt32(masterIdOrdinal); 

    var master = masters[masterId]; 
    master.Details.Add(new Detail{....}); 
} 

Obviamente debe reemplazar los nombres de las columnas con lo que tiene en sus datos, así como proporcionar la inicialización completa de los objetos Maestro y Detalle. Si el conjunto de resultados detallados está ordenado en la ID maestra, el último ciclo podría optimizarse para buscar solo cada maestro una vez desde el diccionario. Si los resultados son pequeños, la ganancia no sería tan grande.

+0

Buena respuesta, pero creo que estás dejando parte de la pregunta sin respuesta. ;-) – Cerebrus

2

... uno seleccione registros de la tabla maestra y otra de tabla secundaria .en código C# quiero conseguir todo este registro y poner todos estos datos en un objeto ...

La solución de Peter funciona para resolver el problema básico de recuperar resultados múltiples con un solo DataReader. Sin embargo, si desea guardar sus datos en un objeto que replique la relación entre las tablas de detalles maestros, en su lugar debería usar un DataSet.

Los DataSets pueden contener múltiples DataTable sy proporcionan soporte completo para las relaciones inherentes entre las tablas al permitir la creación de DataRelation entre las tablas. Luego puede obtener registros relacionados para cada escenario llamando al GetChildRows() o al GetParentRows() desde las tablas Maestra o Detalles, respectivamente.

Probablemente hay muchas muestras en línea que ilustran cómo hacer esto. Here's one discussion thread de mi Grupo donde he enumerado los pasos y proporcioné algunos códigos para demostrar el procedimiento.

+0

Gracias. Ahora, he terminado lo que comencé :) –

Cuestiones relacionadas