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
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.
... 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.
Gracias. Ahora, he terminado lo que comencé :) –
- 1. Instrucción IF en ORDEN BY Cláusula de una instrucción SELECT en un SQL Server Procedimiento almacenado
- 2. ¿Cómo usar un valor de un procedimiento almacenado en otro?
- 3. ¿Cómo verificar si existe un procedimiento almacenado?
- 4. ¿Por qué no se puede usar la instrucción INSERT EXEC dentro de un procedimiento almacenado llamado por otro procedimiento almacenado?
- 5. SQL Server - SELECT FROM procedimiento almacenado
- 6. ¿Qué estoy haciendo mal en este procedimiento almacenado de MySQL?
- 7. ¿Cómo se usa el resultado de SELECT en un procedimiento almacenado en otro procedimiento de srored?
- 8. ¿El procedimiento almacenado más ejecutado?
- 9. Usar la base de datos dentro de un procedimiento almacenado
- 10. Procedimiento almacenado de SQL establece variables usando SELECT
- 11. Usar el cursor en un bucle de un procedimiento almacenado
- 12. ¿Cómo implementar un procedimiento almacenado condicional Upsert?
- 13. ¿Cómo ejecutar un procedimiento almacenado de Oracle?
- 14. ¿Cómo suprimo los resultados de un procedimiento almacenado dentro de un procedimiento almacenado?
- 15. Cómo llamar a un procedimiento almacenado desde otro procedimiento almacenado?
- 16. ¿Existe un "estoy seguro" para la ejecución del procedimiento almacenado? :)
- 17. ¿Cómo selecciono un procedimiento almacenado en Sybase?
- 18. ¿Cómo devuelvo XML de un procedimiento almacenado?
- 19. ¿Cómo usar la función CAST correctamente en una instrucción MySql SELECT?
- 20. Método más sencillo para probar un procedimiento almacenado de Oracle
- 21. Cómo utilizar el parámetro OUTPUT en el procedimiento almacenado
- 22. Cómo llamar a una función escalar en un procedimiento almacenado
- 23. ¿Cómo usar un tipo de tabla en una instrucción SELECT FROM?
- 24. Ejecutar un procedimiento almacenado dentro de un procedimiento almacenado
- 25. Cómo guardar un procedimiento almacenado?
- 26. Cómo simular una impresión en un procedimiento almacenado de MySQL
- 27. ¿Cómo programar un procedimiento almacenado?
- 28. SqlDataReader dentro de SqlDataReader
- 29. ¿Cómo desactivo los resultados de la consulta al ejecutar un procedimiento almacenado desde un procedimiento almacenado?
- 30. Procedimiento almacenado al ejecutar otro procedimiento almacenado
Buena respuesta, pero creo que estás dejando parte de la pregunta sin respuesta. ;-) – Cerebrus