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

di Riccardo Golia, in UserScript, ASP.NET 2.0, ADO.NET,

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();

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi