Uwaga: Ta odpowiedź jest istotna, jeśli zdecydujesz się użyć podstawowej funkcji ADO.NET 2 zamiast ORM (takiej jak Entity Framework lub NHibernate) lub LINQ to SQL.
Załóżmy, że masz parametry połączenia zdefiniowane w swoim app.config
:
<connectionStrings>
<add name="SomeConnection"
providerName="System.Data.SqlClient"
connectionString="..." />
</connectionStrings>
Zwróć uwagę na obecność providerName
atrybut i jego wartość. Możesz również podać wartość innego dostawcy bazy danych, np. System.Data.SQLite
.
(Zwróć uwagę, że niestandardowi dostawcy, tj. ci, którzy domyślnie nie są w .NET Framework, muszą być najpierw zarejestrowani, albo w app.config
lub w pliku machine.config
komputera klienckiego .)
Teraz możesz pracować z określoną bazą danych w sposób całkowicie niezależny od dostawcy w następujący sposób:
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();
}
}
Zauważ, że ten kod działa tylko z typami interfejsów. Jedynym miejscem, w którym wskazujesz konkretnego dostawcę bazy danych, jest providerName
wartość atrybutu w app.config
plik. (Zaznaczyłem wszystkie miejsca, w których ustawienie z app.config
jest pobierany z ^^^
s.)
Dalsza lektura:
-
Kodowanie ogólne z klasami podstawowymi i fabrykami ADO.NET 2.0:
podobne do mojej odpowiedzi, ale bardziej szczegółowe. -
Zarządzani dostawcy ADO.NET i DataSet Developer Center:
zawiera między innymi indeks dostępnych dostawców baz danych ADO.NET.