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

posted @ sabato 20 settembre 2003 14:45

Print
Comments have been closed on this topic.
«ottobre»
domlunmarmergiovensab
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456