2009-04-12 8 views
6

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

17

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.

+0

Buona risposta, ma penso che stai lasciando una parte della domanda senza risposta. ;-) – Cerebrus

2

... 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.

+0

Grazie. Ora, ho finito quello che ho iniziato :) –

Problemi correlati