簡述在ADO中使用介面的抽象資料提供程式以及ADO.NET資料提供程式工廠模型

淺淺*夏發表於2018-12-21

如何在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>

 

相關文章