Un tip mai pubblicato...

Il tip che segue l'ho scritto al ritrono dal Tech2003 di Barcellona... è un suggerimento Castro, non Fidel ovviamanete, ma Pablo - PM di ADO.NET :p

Vi è mai capitato di voler spostare i dati da un DataReader ad un DataSet? Effettivamente non è cosa che si fa spesso ma nel web potrebbe essere utile quando si vogliono paginare i dati in una griglia "allow custom paging" (questa è un suggerimento/osservazione mia che ci ho messo un po a focalizare il senso della domanda e del tip).

I DataAdapter non espongono pubblicamente metodo che sembrano adatti al nostro scopo, tuttavia System.Data.Common.DbDataAdapter ha un metodo protetto molto interessante che fa proprio al caso nostro, quello che dobbiamo fare è semplicemente ereditare la classe per poterlo usare! Ecco la mia soluzione:

public class MyDataAdapter: DbDataAdapter
{
//Definisco e implemento un metodo statico che dato un IDataReader popola
//un DataSet a partire da una certa posizione (startRecord) per un certo numero
//di occorrenze (maxRecords)
public static void Fill(IDataReader dr, DataSet ds, string TableName, int startRecord, int maxRecords){
 MyDataAdapter adp = new MyDataAdapter();
 adp.Fill(ds, TableName, dr, startRecord, maxRecords);
}
//DbDataAdapter è una classe astratta che richiede l'implementazione di
//alcuni metodi, darò loro una inutile implementazione e impedirò la creazione di istanze
//di questa classe definendo esplicitamente privato il costruttore... in fondo a me servirà
//esclusivamente la il metodo Fill statico sopra definito.
protected override RowUpdatedEventArgs CreateRowUpdatedEvent(/*{...}*/)
 {throw new NotSupportedException();}
protected override RowUpdatingEventArgs CreateRowUpdatingEvent(/*{...}*/)
 {throw new NotSupportedException();}
protected override void OnRowUpdated(/*{...}*/)
 {throw new NotSupportedException();}
protected override void OnRowUpdating(/*{...}*/)
 {throw new NotSupportedException();}
//definizione esplicita del costruttuttore
private MyDataAdapter(){;}
}
Ecco un esempio di utilizzo dove popolo un dataset con le occorrenze dalla quinta per 10 occorrenze.
//sia OpenDataReader una procedura per l'apertura di un DataReader
IDataReader dr = OpenDataReader();
DataSet ds = new DataSet();
MyDataAdapter.Fill(dr, ds, "Tabella", 5, 10);
Perchè non l'ho mai proposto ufficialemnte su UGI? Ho alkuni dubbi se applicato korrettemente quanto era stato detto nella sessione... quando mi ricorderò come mai non sono convinto di quanto fatto... beh sicuramente lo spiegherò :p
«settembre»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011