寫一個通用數據訪問組件

發表于:2007-05-25來源:作者:點擊數: 標簽:通用訪問一個組件數據
寫一個通用數據訪問組件 Willsound( willsound@163.com ) 我收到過好多 Email 來問我如何用一個通用的數據提供者 ( data provider) 在不失自然數據提供者 (native data provider) 穩定而強大功能的前提下來訪問不同的數據源 (data sources). 一個小伙子甚至

寫一個通用數據訪問組件

         Willsound(willsound@163.com)

 

我收到過好多Email來問我如何用一個通用的數據提供者(data provider)在不失自然數據提供者(native data provider)穩定而強大功能的前提下來訪問不同的數據源(data sources).一個小伙子甚至問我能不能寫一些代碼在程序運行時指定數據提供者(data provider)。

緒論:

ADO.net對于不同的數據源提供了不同的數據提供者,三個通用的數據提供者分別是OLE DB, SQL, and ODBC。使用不同數據提供者的用意就在于可以針對不同的數據源提供最強大且穩定的數據訪問技術。例如,當你訪問Aclearcase/" target="_blank" >ccess數據庫時采用OLE DB data provider這是最有效的方法,但是如果你采用ODBC data provider時,它是建在OLE DB data provider基礎上的,所以效率就會打折扣。

實際上,所有的數據提供者類(data provider classes),比如連接(connection),命令(command),數據適配器(data adapter)和數據讀取者(data reader)都是從某一特定接口繼承的。我希望寫篇文章深入的討論這些,但這要花費我很多天的時間。

總之,我的這篇文章的主要問題是如何寫一個通用的類能夠在運行時根據用戶的選擇而分別采用OLE DB, SQL, and ODBC data providers訪問數據源。

接口模型:

每一種數據提供者都實現了一些接口(interfaces),這些接口都定義在System.Data名字空間(namespace)里面。例如SqlConnection, OleDbConnection, and OdbcConnection類就是從IdbConnection接口繼承下來的。類似于connection類,其它的ADO.net組件像DataAdapter, DataReader, Command也都是從某個接口繼承下來的。

你們就將使用這些接口來實現通用數據訪問類。我不打算去寫所有的這些功能,但我會給你們如何擴展這些功能提供一個好的想法。

下面的代碼1展現了一個GenericAdoNetComp,它提供了二個方法,GetConnection GetDataAdapter。這兩個方法都是從用戶提供提供的信息關基于connection讀取信息,這二個方法將返回所希望的輸出。下面就是這兩個方法的定義

public IDbConnection GetConnection(int connType, 
string connString)

public IDbDataAdapter GetDataAdapter(int connType, 
string connString, string sql)

正如你你所見,我們用IdBConnection取代connection和一個數據提供者相連,方法將返回IdbConnection.從下面的代碼1中你們將看到我們根據用戶在運行時提供的連結種類類型參數(connection type argument)來生成SqlConnection, OleDbConnection, or或者OdbcConnection。

//代碼1

using System;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.Data.SqlClient;
using Microsoft.Data.Odbc; 

namespace GenericDataAccessApp
{
public class GenericAdoNetComp
{
private IDbConnection idbConn = null;
private IDbDataAdapter idbAdapter = null;
private DbDataAdapter dbAdapter = null;
private IDataReader iReader = null;

public GenericAdoNetComp()
{
}

// GetConnection returns IDbConnection 
public IDbConnection GetConnection(int connType, 
string connString)

{
switch(connType) 
{
case 1: // OleDb Data Provider
idbConn = new OleDbConnection(connString);
break;
case 2: // Sql Data Provider
idbConn = new SqlConnection(connString);
break;
case 3: // ODBC Data Provider
idbConn = new OdbcConnection(connString); 
break;
// case 3: // Add your custom data provider
default:
break;
}
return idbConn;
}

// GetDataAdapter returns IDbDataAdapter
public IDbDataAdapter GetDataAdapter(int connType, 
string connString, string sql)

{
switch(connType) 
{
case 1: // OleDb Data Provider
idbAdapter = new OleDbDataAdapter(sql, connString);
break;
case 2: // Sql Data Provider
idbAdapter = new SqlDataAdapter(sql, connString); 
break;
case 3: // ODBC Data Provider
idbAdapter = new OdbcDataAdapter(sql, connString); 
break;
// case 3: // Add your custom data provider
default:
break;
}
return idbAdapter;
}
}
}

用戶應用程序:

現在,就讓我們來看看如何在windows應用程序里面使用這個類。為了進行測試,我們創建了一個windows應用程序,程序介面如下圖:

在窗體上我們放上三個radio buttons控件,一個button控件,一個Group Box控件和一個DataGrid 控件。

從窗體的部局上我們可以猜的出,此程序可以根據用戶的選擇來確定使用哪種數據提供者。正如你在上圖所看到的,窗體上有三個選項,你可以選擇其一,然后單擊connect按鈕。根據選擇的連接類型,聯結到數據庫關且向DataGrid中填充數據。

在我的應用程序里面,我定義了下面的變量。

private string connString, sql;
IDbConnection conn = null;
IDbDataAdapter adapter = null;

下面就是connect按鈕的的代碼,在哪里創建了一個GenericAdoNetComp類的實例,并且調用它的GetConnection GetDataAdapter 方法。一但你提供了一個DataAdapter,你只需簡單的調用FillUpdate方法來讀取和寫入數據。

private void ConnectBtn_Click(object sender, System.EventArgs e)
{
GenericAdoNetComp genDP = new GenericAdoNetComp();
sql = "SELECT * FROM Employees";

if(radioButton1.Checked)
{
connString = 
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\\Northwind.mdb";
conn = genDP.GetConnection(1, connString);
adapter = genDP.GetDataAdapter(1, connString, sql);
}
else if (radioButton2.Checked)
{
connString = 
"Data Source=MCB;Initial Catalog=Northwind;user id=sa;password=;";
conn = genDP.GetConnection(2, connString);
adapter = genDP.GetDataAdapter(2, connString, sql);
}
else if (radioButton3.Checked)
{
// Construct your connection string here
conn = genDP.GetConnection(3, connString);
adapter = genDP.GetDataAdapter(3, connString, sql);
}

try
{
conn.Open();
// Fill a DataSet
DataSet ds = new DataSet();
adapter.Fill(ds);
dataGrid1.DataSource = ds.Tables[0].DefaultView;
}
catch(Exception exp)
{
MessageBox.Show(exp.Message);
}
finally
{
conn.Close();
}
}

總結:

在這篇文章里,我們討論了如何寫一個通用數據訪問類。你可以擴展用ADO.net中其實的組組件來這個類的功能,我一直努力使這篇文章通俗易懂。

 

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97