Nota: Questa risposta è rilevante se decidi di utilizzare la funzionalità di base di ADO.NET 2 invece di un ORM (come Entity Framework o NHibernate) o LINQ to SQL.
Supponiamo che tu abbia una stringa di connessione definita nel tuo app.config
:
<connectionStrings>
<add name="SomeConnection"
providerName="System.Data.SqlClient"
connectionString="..." />
</connectionStrings>
Notare la presenza del providerName
attributo e il suo valore. Potresti anche inserire un valore per un altro provider di database, ad es. System.Data.SQLite
.
(Si noti che i provider non standard, ovvero quelli che non sono in .NET Framework per impostazione predefinita, devono essere prima registrati, in app.config
o nel machine.config
della macchina client .)
Ora puoi lavorare con il database specificato in modo completamente indipendente dal provider come segue:
using System.Configuration; // for ConfigurationManager
using System.Data; // for all interface types
using System.Data.Common; // for DbProviderFactories
var cs = ConfigurationManager.ConnectionStrings["SomeConnection"];
// ^^^^^^^^^^^^^^^^
var factory = DbProviderFactories.GetFactory(cs.ProviderName);
// ^^^^^^^^^^^^^^^
using (IDbConnection connection = factory.CreateConnection())
{
connection.ConnectionString = cs.ConnectionString;
// ^^^^^^^^^^^^^^^^^^^
connection.Open();
try
{
using (IDbCommand command = connection.CreateCommand())
{
... // do something with the database
}
}
finally
{
connection.Close();
}
}
Nota come questo codice funziona solo con i tipi di interfaccia. L'unico punto in cui indichi un particolare provider di database è tramite il providerName
valore dell'attributo in app.config
file. (Ho contrassegnato tutti i punti in cui un'impostazione da app.config
è preso con ^^^
s.)
Ulteriori letture:
-
Codifica generica con le classi e le fabbriche di base di ADO.NET 2.0:
simile alla mia risposta, ma entra più in dettaglio. -
Provider ADO.NET gestiti e centro per sviluppatori di set di dati:
include, tra le altre cose, un indice dei provider di database ADO.NET disponibili.