Quando dobbiamo caricare una datatable il metodo migliore è quello di usare un data adapter, ogni provider dati di ADO.NET ne possiede uno specifico. I data adapter permettono di caricare tramite il metodo Fill - nelle sue varie forme - una datatable e/o un dataset avendo come input un comando testuale o uno specifico command. Nessun data adapter mette a disposizione overload che usano un DataReader come sorgente. In genere i data adapter derivano da DbDataAdapter che dispone di tale funzionalità in modalità protetta e che nessuno specifico data adapter rimappa come pubblica. Ecco come farlo estendendo DbDataAdapter.
// "Il metodo ritorna il numero di righe aggiunte con esito positivo o aggiornate nell'oggetto DataTable."
// vedi documentazione MSDN: DbDataAdapter.Fill(DataTable, IDataReader).
public class GenericDbDataAdapter: DbDataAdapter
{
public int FillFromReader(DataTable data, IDataReader reader)
{
return base.Fill(data, reader);
}
// Nel framework 1.x occorre implementare - anche usando NotSupportedException - i metodi astratti:
// CreateRowUpdatedEvent, CreateRowUpdatingEvent, OnRowUpdated e OnRowUpdating.
}
Quale applicazione pratica potremmo avere? Ad esempio quando si ha la necessità di caricare i dati in una datatable senza perdere i metadati relativi allo schema della base dati, IDataReader.GetSchemaTable.
DataTable schema;
DataTable data = new DataTable();
GenericDbDataAdapter adp = new GenericDbDataAdapter();
using(IDataReader myReader = myCommand.ExecuteReader())
{
schema = myReader.GetSchemaTable();
adp.Fill(data, myReader);
}