#805 - Codice indipendente dal database con il ProviderFactory di ADO.NET 2.0

ADO.NET, la parte del .NET Framework dedicata all'accesso a database e sorgenti dati di tipo relazionale, ha subito nella nuova versione importanti modifiche che ne hanno senz'altro migliorato l'architettura. Una delle novità più significative è rappresentata dal fatto che ciascun oggetto contenuto in un Data Provider di ADO.NET 2.0 deriva da una specifica classe base di tipo astratto contenuta nel namespace System.Data.Common. Per esempio, System.Data.SqlClient.SqlConnection deriva da System.Data.Common.DbConnection, System.Data.OleDb.OleDbCommand deriva da System.Data.Common.DbCommand e così via. Oltre agli oggetti tradizionali, già presenti nelle versioni precedenti del .NET Framework, in ciascun Data Provider è stato introdotto un oggetto factory per la creazione delle istanze.

Ciascun oggetto factory associato ad uno specifico Data Provider di ADO.NET deriva dalla classe System.Common.DbProviderFactory, applica il design pattern Abstract Factory e include in particolare i metodi di creazione delle istanze di connessioni, comandi, DataAdapter e parametri.

La classe statica DbProviderFactories contenuta anch'essa nel namespace System.Data.Common espone il metodo GetFactory(string) che permette di istanziare uno specifico oggetto DbProviderFactory in funzione del nome invariante del Data Provider. L'elenco dei Data Provider disponibili è presente nell'ambito del machine.config e per ciascuno di essi è indicato il relativo nome invariante che lo identifica univocamente.

Una volta istanziato l'oggetto factory in funzione del nome invariante, è possibile creare connessioni, eseguire comandi e navigare i resultset di una query in modo indipendente dal Data Provider in uso. Il codice che ne risulta è indipendente dal particolare Data Provider utilizzato.

string providerInvariantName = ConfigurationManager.ConnectionStrings["DataSource"].ProviderName;
string connectionString = ConfigurationManager.ConnectionStrings["DataSource"].ToString();
DataTable dt = new DataTable();

// Creazione dell'oggetto factory

DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName);

// Interrogazione del database

using (DbConnection connection = factory.CreateConnection())
{
  connection.ConnectionString = connectionString;
  connection.Open();

  using (DbDataAdapter adatpter = factory.CreateDataAdapter())
  {
    DbCommand select = factory.CreateCommand();
    select.CommandText = "SELECT * FROM Customers";
    select.Connection = connection;
    adatpter.SelectCommand = select;
    adatpter.Fill(dt);
  }
}

// Data-Binding di una ipotetica griglia di dati

gridDemo.DataSource = dt;
gridDemo.DataBind();


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

ras78 scrive:
#805 - Codice indipendente dal database con il ProviderFactory di ADO.NET 2.0

Ormai si tende a scrivere tonnellate di layer, wrapper di wrapper, tutto per facilitare la scrittura di codice ed aumentare la produttività (otrtima ...
martedì 20 giugno 2006 | 1 risposta
dops scrive:
#805 - Codice indipendente dal database con il ProviderFactory di ADO.NET 2.0

e le prestazioni?insomma perchè non utilizzare un provider specifico per un database anzicchè uno astratto? Certo, se domani cambia il database non ...
venerdì 2 giugno 2006 | 2 risposte

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC