Catatan: Jawaban ini relevan jika Anda memutuskan untuk menggunakan fungsionalitas dasar ADO.NET 2 alih-alih ORM (seperti Entity Framework atau NHibernate) atau LINQ to SQL.
Mari kita asumsikan Anda memiliki string koneksi yang ditentukan di app.config
. Anda :
<connectionStrings>
<add name="SomeConnection"
providerName="System.Data.SqlClient"
connectionString="..." />
</connectionStrings>
Perhatikan keberadaan providerName
atribut dan nilainya. Anda juga dapat memasukkan nilai untuk penyedia DB lain, mis. System.Data.SQLite
.
(Perhatikan bahwa penyedia non-standar, yaitu yang tidak ada dalam .NET Framework secara default, harus didaftarkan terlebih dahulu, baik di app.config
atau di machine.config
mesin klien .)
Sekarang, Anda dapat bekerja dengan database yang ditentukan dengan cara yang sepenuhnya agnostik penyedia sebagai berikut:
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();
}
}
Perhatikan bagaimana kode ini hanya bekerja dengan tipe antarmuka. Satu-satunya tempat di mana Anda menunjukkan penyedia DB tertentu adalah melalui providerName
nilai atribut di app.config
mengajukan. (Saya telah menandai semua tempat di mana pengaturan dari app.config
diambil dengan ^^^
s.)
Bacaan lebih lanjut:
-
Pengodean Umum dengan Kelas dan Pabrik Dasar ADO.NET 2.0:
mirip dengan jawaban saya, tetapi lebih detail. -
Penyedia Terkelola ADO.NET dan Pusat Pengembang DataSet:
termasuk, antara lain, indeks penyedia basis data ADO.NET yang tersedia.