Ho codificato tre istruzioni select nella stored procedure in Microsoft SQL Server 2005. Entrambe le istruzioni select restituiscono più numeri di record ed elenchi di tabelle per le istruzioni selezionate è diverso. Uno seleziona i record da una tabella principale e l'altro da una tabella figlio. Nel codice C# voglio ottenere tutti questi record e mettere tutti i dati in un oggetto. Sto usando SqlDataReader. È possibile con esso o dovrei fare qualcos'altro.Come utilizzare SqlDataReader se sto avendo più di una istruzione select in una stored procedure
risposta
Si utilizza il metodo the NextResult sul datareader per navigare con più risultati da una query.
Per scorrere tutti i dati che si farebbe qualcosa di simile:
var moreResults = true;
while (moreResults)
{
while (reader.Read())
{
...
}
moreResults = reader.NextResult();
}
Quindi, con questo come sfondo, e supponendo che il gruppo di risultati maestro viene prima, che popolano principali e di dettaglio di oggetti potrebbe essere fatto in questo modo:
in primo luogo, costruire un dizionario dei record master:
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, ....});
}
Avanti, passare a record di dettaglio e aggiungere quelli al loro padrone corrispondente:
reader.NextResult();
var masterIdOrdinal = reader.GetOrdinal("masterId");
while (reader.Read())
{
var masterId = reader.GetInt32(masterIdOrdinal);
var master = masters[masterId];
master.Details.Add(new Detail{....});
}
Dovresti ovviamente sostituire i nomi delle colonne con quello che hai nei tuoi dati così come fornire l'inizializzazione completa degli oggetti Master e Dettagli. Se il set di risultati del dettaglio è ordinato sull'id master, l'ultimo ciclo potrebbe essere ottimizzato per cercare solo ogni master una sola volta dal dizionario. Se i risultati sono piccoli, il guadagno non sarebbe così grande.
... uno selezionare i record dalla tabella master e altro da tabella figlio .in C# codice voglio ottenere tutto questo record e mettere tutti questi dati in un oggetto ...
La soluzione di Peter funziona per risolvere il problema di base del recupero di più risultati con un singolo DataReader
. Tuttavia, se vuoi salvare i tuoi dati su un oggetto che replica la relazione tra le tabelle Master-Details, dovresti usare invece un DataSet
.
I DataSet possono contenere più DataTable
s e fornire supporto completo per le relazioni intrinseche tra le tabelle consentendo la creazione di DataRelation
s tra le tabelle. Quindi è possibile ottenere i record correlati per ogni scenario chiamando GetChildRows()
o GetParentRows()
rispettivamente dalle tabelle Master o Dettagli.
Probabilmente ci sono molti esempi online che illustrano come farlo. Here's one discussion thread dal mio gruppo in cui ho elencato i passaggi e fornito codice per dimostrare la procedura.
Grazie. Ora, ho finito quello che ho iniziato :) –
- 1. Istruzione IF in ORDER BY Clausola di un'istruzione SELECT in una stored procedure di SQL Server
- 2. Come utilizzare un valore da una stored procedure in un'altra?
- 3. Chiamare una stored procedure in una stored procedure in MySQL
- 4. SSRS: restituisce più query in una stored procedure
- 5. Come utilizzare una stored procedure in ADO.NET Entity Framework
- 6. SQL: utilizzare più valori in un'unica istruzione SELECT
- 7. SQL Stored Procedure set variables using SELECT
- 8. Come chiamare una stored procedure in CodeIgniter?
- 9. Controllare se SELECT restituisce tutte le righe in stored procedure
- 10. Dovrei usare un ORM se sto usando le stored procedure?
- 11. Come chiamare una stored procedure da un'altra stored procedure?
- 12. Come si eliminano i risultati da una stored procedure da una stored procedure?
- 13. Come pianificare una stored procedure?
- 14. Chiamare una stored procedure definita dall'utente dall'istruzione select mysql
- 15. Entity Framework: come inserire più stored procedure in una transazione?
- 16. Come chiamare una stored procedure in JDBC
- 17. Rinominare una stored procedure in SQL Server
- 18. Utilizzare SQL per filtrare i risultati di una stored procedure
- 19. Devo usare SqlDataReader all'interno di una istruzione "using"?
- 20. SELECT rispetto a stored procedure SQL Server
- 21. Come utilizzare DROP TABLE SE ESISTE in una stored procedure MySQL
- 22. Assegnare una selezione a una variabile in una stored procedure
- 23. Come eseguire una stored procedure all'interno di una query selezionata
- 24. Come simulare una stampa in una stored procedure MySQL
- 25. Come programmare una stored procedure in AZURE
- 26. Come scrivere una stored procedure in phpMyAdmin?
- 27. Come posso partecipare a una stored procedure?
- 28. Come rilevare se esiste già una stored procedure
- 29. Utilizzare stored procedure per inserire alcuni dati in una tabella
- 30. Interrogare i risultati di una stored procedure
Buona risposta, ma penso che stai lasciando una parte della domanda senza risposta. ;-) – Cerebrus