Provider Factory Model

    內容表格
    沒有標頭

    版本為 09:45, 27 Nov 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    ADO.NET對於各家DBMS的特殊性, 都有專門的Data Provider. 這是由於一般化的資料提供者模型所導致的, 抽象的提供者模型, 代表有相關的簽章存在, 使各家的Data Provider具象元件享有共通的特徵, 並且允許擴展更多獨特的機能.

    .NET 2.0後, 引進了工廠(factory)設計, 大多的.NET Data Provider都包含繼承自DbProviderFactory的base-class. DbProviderFactory是針對資料提供者的提供者, 這個提供者包含了幾種資料物件產生的簽章. 例如:
    1. CreateCommand
    2. CreateCommandBuilder
    3. CreateConnection
    4. CreateDataAdapter
    5. CreateParameter
    那工廠物件要如何產生具象的資料提供者? 從如下所示來看:
    DbProviderFactory dbProviderFactory;
    dbProviderFactory=DbProviderFactories.GetFactory("System.Data.SqlClient");
    可以看到一個極為重要的著眼點, 那就是GetFactory的靜態操作方法. 透過這個靜態操作方法傳入硬式編碼(hard-coded)的有效字串, 這個字串是被登入在相關的組態檔上. 該字串就是特有的對應命名空間.
    用一個靜態操作來產生特定的具象提供者元件, 兩個關鍵點:
    1. 一個針對提供者工廠的存在
    2. 應用靜態操作產生資料提供者
    這兩個關鍵點可以知道這是一個非常典型的Simple Factory應用. 相關的硬式編碼參數被記載到machine.config組態文件中.
    list_data_provider.gif
    以下的代碼可以列舉目前所安裝的Data Provider.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Data.Common;

    namespace WA_ADONET
    {
        public partial class listdataprovider : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                DataTable dtDataProviders = DbProviderFactories.GetFactoryClasses();
                //GvDataProviders is a GridView component
                GvDataProviders.DataSource = dtDataProviders;
                GvDataProviders.DataBind();
            }
        }
    }
    畫面展現如下:
    gv_listdataprovider.gif

    下面的簡單代碼可以清楚知道Data Provider的使用:
    using System;
    using System.Configuration;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Data.Common;
    using System.Data.SqlClient;

    namespace WA_ADONET
    {
        public partial class usingsqldataprovider : System.Web.UI.Page
        {
            private const string DATA_PROVIDER_NAME = "System.Data.SqlClient";
            private const int CONNECTION_STRING_INDEX = 1;

            protected void Page_Load(object sender, EventArgs e)
            {
                string connString = ConfigurationManager.ConnectionStrings[CONNECTION_STRING_INDEX].ConnectionString;

                DbProviderFactory dbProvider = DbProviderFactories.GetFactory(DATA_PROVIDER_NAME);
                DbConnection dbConnection = dbProvider.CreateConnection();
                DbCommand dbCommand = dbProvider.CreateCommand();
                DbDataAdapter dbDataAdapter = dbProvider.CreateDataAdapter();
                DataSet dataSet = new DataSet();

                dbConnection.ConnectionString = connString;

                dbCommand.Connection = dbConnection;
                dbCommand.CommandText = "SELECT TOP 10 * FROM Mail ORDER BY CDATE DESC";
               
                dbDataAdapter.SelectCommand = dbCommand;
                dbDataAdapter.Fill(dataSet);
                //GvMails is a GridView component
                GvMails.DataSource = dataSet.Tables[0];
                GvMails.DataBind();      
            }
        }
    }
    DataAdapter元件屬於離線式設計, 所以不需要建立Connection元件時要另外呼叫Open和Close的操作. 一切由DataAdapter進行黑箱作業.

    Powered by MindTouch Core