Home > Programmazione > Utilizzare l’oggetto DataReader di ADO.NET
Jul
29

ADO.NET offre un supporto nativo per i dati disconnessi attraverso oggetti come DataAdpter, Dataset e DataTable. Se da un lato però tali strumenti presentano il vantaggio di permettere l’accesso ai dati in modo disconnesso, dall’altro possono risultare poco performanti (e a volte addirittura inutilizzabili) quando ad esempio si ha necessità di leggere una grande quantità di dati.

 

E’ proprio questo il problema che abbiamo dovuto affrontare durante lo sviluppo di un modulo sw che fosse in grado di caricare ed elaborare un elevato numero di record da un Database SQL Server (parliamo di circa 5.000.000 di record ad elaborazione). L’utilizzo di oggetti come i DataAdapter e DataSet portava inevitabilmente ad una eccezzione di “OutOfMemory”.

 

In questi casi è dunque consigliabile effettuare un accesso sequenziale ai dati e ciò è possibile tramite l’oggetto DataReader di ADO.NET.

I risultati vengono restituiti all’esecuzione della query e vengono archiviati nel buffer di rete del client finché non vengono richiesti utilizzando il metodo Read del DataReader. L’utilizzo del DataReader consente di migliorare le prestazioni dell’applicazione recuperando i dati non appena sono disponibili e, per impostazione predefinita, archiviando solo una riga alla volta per evitare di sovraccaricare il sistema.

 

Per recuperare dati mediante un DataReader, è necessario creare un’istanza dell’oggetto Command, quindi creare un DataReader chiamando Command.ExecuteReader per recuperare righe da un’origine dati.

Il metodo Read dell’oggetto DataReader viene utilizzato per ottenere una riga dai risultati della query. È possibile accedere a ogni colonna della riga restituita passando il nome o il riferimento ordinale della colonna al DataReader. Per migliorare le prestazioni, tuttavia, DataReader fornisce una serie di metodi che consentono di accedere ai valori delle colonne nei tipi di dati nativi, quali GetDateTime, GetDouble, GetGuid, GetInt32 e così via.

 

Di seguito un esempio di utilizzo dei DataReader:


SqlCommand command = new SqlCommand(
  "SELECT CategoryID, CategoryName FROM dbo.Categories;" +
  "SELECT EmployeeID, LastName FROM dbo.Employees", connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
do
{
  Console.WriteLine("\t{0}\t{1}", reader.GetName(0), reader.GetName(1));
  while (reader.Read())
    Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0), reader.GetString(1));
} while (reader.NextResult());
reader.Close();
connection.Close();

È necessario chiamare sempre il metodo Close una volta terminato l’utilizzo dell’oggetto DataReader.

I parametri di output o i valori restituiti presenti nell’oggetto Command non saranno disponibili fino a quando l’oggetto DataReader non viene chiuso.

Notare che quando è aperto un oggetto DataReader, l’oggetto Connection viene utilizzato esclusivamente da quell’oggetto DataReader. Non sarà possibile eseguire alcun comando per l’oggetto Connection, né creare un altro DataReader fino a quando il DataReader originale non viene chiuso.

 

Per altre info su Metodi e Proprietà dell’oggetto vi rimandiamo alla documentazione ufficiale del Framework.

 

Add reply