ADO.NET連接數據庫時,實例化***Connection(例如:OleDbConnection 、SqlConnection等)的時候需要指定連接字符串,除了利用抽象工廠模式利用反射實現靈活的連接之外,還可以通過DbProviderFactory類實現一定的靈活性。
首先介紹兩個類:DbProviderFactory和DbProviderFactories。
DbProviderFactories:提供一組靜態方法,這些方法用於創建 DbProviderFactory類的一個或多個實例。 方法列表如下:
DbProviderFactory:提供一組方法,這些方法用於創建提供程序對數據源類的實現的實例。
通常情況下,獲取Access數據操作基本代如下:
1 string pathString = "\\database.mdb"; 2 string conString = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + pathString; 3 OleDbConnection DataOleDbConnection = new OleDbConnection(conString); 4 DataOleDbConnection.Open(); 5 OleDbCommand DataOleDbCommand = new OleDbCommand("select * from table_user", DataOleDbConnection); 6 OleDbDataReader DataOleDbDataReader = DataOleDbCommand.ExecuteReader(); 7 return DataOleDbDataReader;
查看代碼就會發現數據提供者(Provider=Microsoft.Jet.Oledb.4.0)在連接字符串中已經給定,這樣程序就失去了一定的靈活性,雖然可用switch...case語句構造不同的連接對象,但是更好的辦法是利用DbProviderFactory和DbProviderFactories根據選擇的提供者動態的創建這些對象。其過程很簡單,就是將包含提供者名的字符串傳遞給DbProviderFactories類的靜態方法GetFactory(),該方法返回一個工廠對象(DbProviderFactory),這個對象用於創建提供者所需的指定的對象。代碼如下:
1 DbProviderFactory factory; 2 string provider = "System.Data.SqlClient"; 3 string connstr = "Data Sourse =;Initial Catalog =;User Id = ;Password = "; 4 factory = DbProviderFactories.GetFactory(provider); 5 using (DbConnection conn = factory.CreateConnection()) 6 { 7 conn.ConnectionString = connstr; 8 try 9 { 10 conn.Open(); 11 DbCommand cmd = factory.CreateCommand(); 12 cmd.CommandText = "Select * from table_name"; 13 cmd.Connection = conn; 14 DbDataReader dr; 15 dr = cmd.ExecuteReader(); 16 dr.Read(); 17 conn.Close(); 18 } 19 catch (System.Exception ex) 20 { 21 Console.WriteLine(ex.Message); 22 } 23 }
對於 string provider = "System.Data.SqlClient"可以通過下列方法獲取System.Data.Common.DbProviderFactory的所有已安裝提供程序的信息。
using System; using System.Text; using System.Data.Common; using System.Data; namespace Demo { class Program { static void Main(string[] args) { DataTable dt = DbProviderFactories.GetFactoryClasses(); foreach (DataRow dr in dt.Rows) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < dt.Columns.Count; i++) { sb.Append((i + 1).ToString() + " ").Append(dr[i].ToString()); sb.Append("\n"); } Console.WriteLine(sb.ToString()); } Console.ReadKey(); } } }
運行結果如下: