如何在ADO中使用介面的抽象數據提供程式 在cofig中 appSettings下,配置數據連接類型 使用介面的抽象數據提供程式 ADO.NET數據提供程式工廠模型 .NET數據提供程式工廠模式能讓我們用多種數據訪問類型構建單個代碼庫。而且通過應用程式配置文件(和全新的<connectionstri ...
如何在ADO中使用介面的抽象數據提供程式
在cofig中 appSettings下,配置數據連接類型
<appSettings> <!--這個鍵值映射到枚舉值中的某個值--> <add key="provider" value="SqlServer"/> <add key="ConnectionString" value="server=伺服器名;User ID=用戶名;Password=密碼;database=資料庫名;Max Pool Size=3000;Connect TimeOut=60;Pooling=true"/> </appSettings>
使用介面的抽象數據提供程式
Console.WriteLine("******Simple Connecion Factory*****"); IDbConnection mycon = GetConnection(DataProvider.SqlServer); Console.WriteLine(mycon.GetType()); //通過配置文件 string dataProvString = ConfigurationSettings.AppSettings["provider"]; DataProvider dp = DataProvider.None; if (Enum.IsDefined(typeof(DataProvider), dataProvString)) { dp = (DataProvider)Enum.Parse(typeof(DataProvider), dataProvString); } else { Console.WriteLine("Soryy"); } IDbConnection myCn = GetConnection(dp); if (myCn != null) { Console.WriteLine(myCn.GetType().Name); } enum DataProvider { SqlServer, OleDb, Odbc, None } static IDbConnection GetConnection(DataProvider dp) { IDbConnection con = null; switch (dp) { case DataProvider.SqlServer: con = new SqlConnection(); break; case DataProvider.OleDb: con = new OleDbConnection(); break; case DataProvider.Odbc: con = new OdbcConnection(); break; case DataProvider.None: break; default: break; } return con; ; }
ADO.NET數據提供程式工廠模型
.NET數據提供程式工廠模式能讓我們用多種數據訪問類型構建單個代碼庫。而且通過應用程式配置文件(和全新的<connectionstrings>片段),我們無需重新編譯、重新部署程式集就能夠更改和獲取提供程式和連接字元串。
* 數據提供程式中的類都從相同基類繼承並且都被定義在System.Data.Command命名空間內。
*DbCommand:所有命令類的抽象基類
*DbConnction:所有連接類的抽象基類
*DbDataAdapter:所有數據適配器類的抽象基類。
*DbDataReader:所有數據讀取器類的抽象基類。
*DbParameter:所有參數類的抽象基類
*DbTransaction :所有事務類的抽象基類
另外,每個微軟提供的數據提供程式都有一個繼承自System.Data.DbProviderFaCtory 的類。這個基類定義了一些方法來獲取某數據提供程式的數據對象
完整的數據提供程式工廠的例子
string dp = ConfigurationSettings.AppSettings["provider"]; string constr = ConfigurationSettings.AppSettings["ConnectionString"]; DbProviderFactory df = DbProviderFactories.GetFactory(dp); using (DbConnection cn = df.CreateConnection()) { Console.WriteLine(cn.GetType().Name); cn.ConnectionString = constr; cn.Open(); DbCommand cmd = df.CreateCommand(); Console.WriteLine(cmd.GetType().Name); cmd.Connection = cn; cmd.CommandText = "select * from TCustomer"; using (DbDataReader dr = cmd.ExecuteReader()) { Console.WriteLine(dr.GetType().Name); while (dr.Read()) { Console.WriteLine(dr["CreateTime"].ToString()); } } }
數據提供程式工廠模型的潛在缺陷
儘管這個模型很強.但是你要知道,代碼庫其實只能通過抽象基類的成員來使用所有提供程式通用的一些類型和方法。因此在寫代碼庫的時候.你會被局限於system.Data.Common命名空間下的
DbConnection 、 DbCommand 等其他類型公開的成員。
這樣,你會發現這種“泛化的”方式使得我們不能直接訪問特定DBMS的漂亮功能。如果我們必須調用基礎提供程式(比如SqlConnection)的特殊成員,那麼可以通過顯式強制類型轉換就能實現
然而,這樣會使代碼變得不易維護(也缺乏靈活性).因為我們必須增加許多運行時檢測。但如果你希望以最靈活的方式構建數據訪問陣,數據提供程式工廠模劃提供了一個很好的機制
[connectionstrings]元素
我們的連接字元串數據現在在*.config文件的<appSettings>元素中,應用程式配置文件定義了一個新的元素,叫做<connectionstrings>;你能在這個元素內設置任意多的名稱/值組合併且能通過
configurationManager.Connectionstrings 索引器以編程方式訪問。這種方式的(相比使用<appsettings>元素和configurationManager.Appsettings 索引器來訪問)好處在於它能為你的應用程式以一個統一的方式定義多個連接字元串
具體配置如下
<connectionStrings> <add name="ECPublic" connectionString="server=伺服器名;User ID=用戶名;Password=密碼;database=資料庫名;Min Pool Size=100;Max Pool Size=200;"/> <add name="CRM" connectionString="server=伺服器名;User ID=用戶名;Password=密碼;database=資料庫名;Min Pool Size=100;Max Pool Size=200;"/> </connectionStrings>