Skinny site

... un modo di esprimersi

  • Aumenta dimensione caratteri
  • Dimensione caratteri predefinita
  • Diminuisci dimensione caratteri
Home Code Snippets C# Come utilizzare l'oggetto SqlDataReader

Come utilizzare l'oggetto SqlDataReader

E-mail Stampa PDF
Valutazione attuale: / 3
ScarsoOttimo 
Il Datareader è un oggetto molto leggero ed efficiente. Il Datareader espone proprietà e metodi che permettono di ciclare su i risultati di una query. Il metodo ExecuteReader() dell'oggetto ADO.net Command richiede al database che il risultato sia dato attraverso un cursore firehose che è accessibile direttamente dal Datareader. La caratteristica principale di questo cursore è l'estrema velocità di esecuzione a discapito però di alcune funzionalità. E' possibile accedere ai dati presenti nel Datareader in 3 modi illustrati nei seguenti frammenti di codice, do per scontato che la connessione sia stata già preparata.
//Nel frammento sottostante si vede come recuperare i dati dal Datareader, va 
//notato che la prima istruzione che deve essere eseguita è la chiamata al
//metodo Read() dell'oggetto Datareader, questo perchè dopo la creazione
//dell'oggetto il suo puntatore non è posizionato sulla prima riga. Il metodo
//ritorna un booleano che indica se vi sono ulteriori righe oltre quella
//corrente. Benchè il frammento di codice sia funzionante è possibile fare
//meglio osservando il codice successivo.
...
cn.Open();
strSQL = "SELECT * FROM Tabella";
SqlCommand cmd = new SqlCommand(strSQL, cn);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
Console.WriteLine(dr["ID"] + " – " + dr["Name"]);
dr.Close();

//Nel precedente frammento si fa uso della proprità item in modo implicito,
//questo tipo di approccio penalizza le prestazioni del recupero dei dati.
//Attraverso l'uso degli indici è possibile aumentare la velocità di recupero
//dei dati. Purtroppo però non è molto comodo utilizzare gli indici, inoltre
//se l'ordine dei campi selezionati varia potremmo ottenere risultati
//inaspettati. Per ovviare a questo problema il Datareader espone il medoto
//GetOrdinal che recupera l'indice del campo passando il nome della colonna.
//Il seguente frammento mostra le modifiche opportune.
...
SqlDataReader dr = cmd.ExecuteReader();
int intIDOrdinal = dr.GetOrdinal("ID");
int intNameOrdinal = dr.GetOrdinal("Name");
while (dr.Read())
Console.WriteLine(dr[intIDOrdinal ] + " – " +
rdr[intNameOrdinal]);
dr.Close();

//Per concludere conviene precisare che un'ulteriore miglioramneto è possibile
//convertendo esplicitamente il dato attraverso i metodi di conversione esposti
//dal DataReader come mostrato sotto.
...
SqlDataReader rdr = cmd.ExecuteReader();
int intIDOrdinal = dr.GetOrdinal("ID");
int intNameOrdinal = dr.GetOrdinal("Name");
while (dr.Read())
Console.WriteLine(dr.GetString(intIDOrdinal) + " – " +
dr.GetString(intNameOrdinal));
dr.Close();

//Prelevare risultati multipli
//Alcuni Database come MSSQL server permettono l'invio di risultati multipli.
//Per accedere ad ognuno di questi va utilizzato il metodo NextResult per
//spostarsi al resultset successivo. Funziona come l'istruzione Read() con la
//differenza che non deve essere chiamato in via preventiva per il posizionamento.
//Un modo per implementare questa funzionalità consiste nel controllare il
//risultato del metodo Read() e quando restituisce false chiamare il metodo
//NextResult. Quando NextResult ritorna false non ci sono più resultset da
//scorrere. Un esempio è sotto.
...
cn.Open();
string strSQL = "SELECT IDCliente, Name FROM Clienti;" +
"SELECT OrderID, IDCliente FROM Ordini;" +
SqlCommand cmd = new SqlCommand(strSQL, cn);
SqlDataReader dr = cmd.ExecuteReader();
do
{
while (dr.Read())
Console.WriteLine(dr[0] + " – " + dr[1]);
Console.WriteLine();
} while (dr.NextResult());
dr.Close();
Ultimo aggiornamento Sabato 09 Agosto 2008 22:02  

Google Analytics Tracking Module