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";
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進行黑箱作業. 透過呼叫Fill會將佇列執行結果填入到DataSet元件, DataSet元件所取得的結果會配置到一塊緩衝的實體記憶體空間存放並且操作, 處理的當, 他會有很好的執行效能, 但是相對他會拿實體記憶體空間作為換取代價. 下圖為取得的執行畫面:
文件 | 大小 | 日期 | 附件上傳者 | |||
---|---|---|---|---|---|---|
gv_listdataprovider.gif 無描述 | 61.72 KB | 09:40, 27 Sep 2011 | vxr | 動作 | ||
gv_sample1.gif 無描述 | 54.9 KB | 10:09, 27 Sep 2011 | vxr | 動作 | ||
list_data_provider.gif 無描述 | 8.1 KB | 09:30, 27 Sep 2011 | vxr | 動作 |