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組態文件中.
以下的代碼可以列舉目前所安裝的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();
}
}
}
畫面展現如下:
下面的簡單代碼可以清楚知道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";
protected void Page_Load(object sender, EventArgs e)
{
string connString = ConfigurationManager.ConnectionStrings[1].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進行黑箱作業.