>Leggendo in giro ho capito che il DataReader è più performante
>del DataAdapter... Inoltre quando uso il DataReader è perchè
>i record mi servono in sola lettura, mentre quando uso il DataAdapter
>posso effettuare aggiornamenti ai dati...
Si, diciamo che il DataAdapter fa effettivamente parecchi controlli, ha una complessità maggiore di quello che ti serve e di conseguenza è meno performante che una lettura diretta da DataReader.
Frammento della sola funzione di Fill del DataAdapter (che a sua volta chiama altre articolate funzioni):
Detto questo andiamo a vedere più da vicino la funzione .Load del DataTable, che uno potrebbe pensare sia sviluppata non utilizzando il DataAdapter:
Invece da come si può vedere da quest'ultimo listato, la Load del DataTable utilizza un LoadAdapter per caricare i dati, a sua volta questo oggetto eredità da DataAdapter e la funzione FillFromReader, non fa altro che richiamare la funzione Fill del DataAdapter:
>Quello che faccio, fondamentalmente, e leggere dal DB e popolare
>un DataTable tipizzato così da implementare per ogni DataRow
>un'interfaccia... Questa interfaccia la uso nel costruttore delle
>classi specializzate per rendere sicura la creazione dell'oggetto.
>Forse l'approccio è sbagliato, non saprei...
Visto bene come funzionano all'interno i due metodi (DataAdapter.Fill e DataTable.Load), possiamo, a mio avviso, tranquillamente spostarci su una soluzione custom. Senza helper di alcun tipo, andremo a riempire il DataTable semplicemente ciclando il DataReader con la funzione .Read, e con poche righe di codice, riuscirai anche a mappare in maniera custom, le colonne con nomi differenti.
while (reader.Read())
{
dt["col1"] = reader["pippo"];
dt["col2"] = reader["pluto"];
dt["col3"] = reader["paperino"];
}
In questo modo eviti sicuramente di utilizzare il DataAdapter, e tra l'altro non ci vogliono poi così tante righe di codice. Potresti anche farti una funzione che dato il Reader, è un Dictionary di stringhe (o hashtable), dove la chiave sarebbe il nome della colonna di destinazione del datatable, e il value il nome della colonna sorgente dal datareader, in questo modo potresti fare una cosa del genere:
Ovviamente questo è solo un esempietto e può e deve essere ancora sviluppato. Ad esempio li si basa solo sul tableMappings, ma se non dovesse esistere la colonna nel datareader darebbe eccezione, potrebbe andare bene anche così, dipende da come uno lo vuole strutturare.
Spero di esserti stato utile.
-------------------------------------------------------------------
Michael Denny
Senior Software Developer - Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/