c 通用資料庫訪問類

2021-04-12 22:04:22 字數 3774 閱讀 5061

在應用程式的設計中,資料庫的訪問是非常重要的,我們通常需要將對資料庫的訪問集中起來,以保證良好的封裝性和可維護性。在.net中,資料庫的訪問,對於微軟自家的sqlserver和其他資料庫(支援oledb),採用不同的訪問方法,這些類分別分布於system.data.sqlclient和system.data.oledb命名空間中。微軟後來又推出了專門用於訪問oracle資料庫的類庫。我們希望在編寫應用系統的時候,不因這麼多類的不同而受到影響,能夠盡量做到資料庫無關,當後台資料庫發生變更的時候,不需要更改客戶端的**。

有的時候,為了效能和其他原因,我們也希望提供對資料庫訪問的快取,特別是資料庫連線的快取。雖然微軟給我們內建了資料庫快取,但是,自己控制快取,無疑可以提供更大的靈活性和效率。

這就需要我們在實際開發過程中將這些資料庫訪問類再作一次封裝。這裡,介紹一種在實際應用中得到了非常好的效果的實作策略。factory和silgleton設計模式是使用的主要方法。

我們先來看看factory的含義:定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使乙個類的例項化延遲到其子類。我們這裡可能會處理對多種資料庫的操作,因此,需要首先定義乙個操縱資料庫的介面,然後,根據資料庫的不同,由類工廠決定例項化哪個類。

下面,我們首先來定義這個訪問介面。為了方便說明問題,我們為這個類定義了比較少的方法,其他的方法是很容易參照新增的。同時注意,我這裡使用了abstract class來定義這個訪問介面,而不是inte***ce,理由在後面可以看到。

public abstract class dboperator //得到資料庫連線 public abstract void open(); //開啟資料庫連線 public abstract void close(); //關閉資料庫連線 public abstract void begintrans(); //開始乙個事務 public abstract void committrans(); //提交乙個事務 public abstract void rollbacktrans(); //回滾乙個事務 public abstract void exesql(string strsql,string strparams,object objvalues); //執行sql語句,沒有返回值 public abstract dataset exesqlfordataset(string querystring);//執行sql,返回dataset }

然後,我們分別為sql server和oledb資料庫編寫兩個資料訪問的具體實現類:

sql server的資料庫訪問類:

internal class sqldboperator: dboperator } public sqldboperator(string strconnection) public override void open() public override void close() public override void begintrans() public override void committrans() public override void rollbacktrans() public override void exesql(string strsql,string strparams,object strvalues)   cmd.executenonquery(); } public override dataset exesqlfordataset(string querystring)     }

oledb資料庫操作的類同sql server資料庫操作的類非常相似,只是把相應的sql類替換成oledb類。需要注意的是,因為oledb和sql server的引數傳遞方式不一致,所以,這裡需要做一點小小的轉換,將"@引數名"型別的引數轉換成"?",這個細節希望讀者能夠注意到。**如下:

internal class oledboperator : dboperator public override idbconnection connection } public override void open() public override void close() public override void begintrans() public override void committrans() public override void rollbacktrans() public override void exesql(string strsql,string strparams,object strvalues)   cmd.executenonquery(); } public override dataset exesqlfordataset(string querystring) }

現在我們已經完成了所要的功能,下面,我們需要建立乙個factory類,來實現自動資料庫切換的管理。這個類很簡單,主要的功能就是根據資料庫連線字串,判斷使用什麼資料庫,然後,返回適當的資料庫操縱類。在這裡,判斷的方法很簡單,只是根據兩種資料庫連線字串的不同來判斷。在實際中,隨著資料庫類的增加,判斷的方法可能會有所變化,讀者應當根據自己的實際情況來做相應的調整。

public class dboperato***ctory   else //other database } }

好了,現在,一切都完成了,客戶端在**呼叫的時候,可能就是採用如下形式:

dboperator db=dboperato***ctory.getdboperator(strconnection)db.open();db.需要的操作db.close();或者:dboperator db=dboperato***ctory.getdboperator(strconnection)db.open();db.begintrans();trycatchdb.close();

當資料庫發生變化的時候,dboperato***ctory會根據資料庫連線字串自動呼叫相應的類,客戶端不會感覺到變化,也不用去關心。這樣,實現了良好的封裝性。當然,前提是,你在編寫程式的時候,沒有用到特定資料庫的特性,例如,sql server的專用函式。

實際上,factory模式也可以不使用factory類來實現,而是讓介面抽象類自己來管理,這可以稱作自管理的factory,是factory模式的一種變形。這麼做的好處,是可以免去乙個factory類,使**更加簡練。這麼做,我們需要對dboperator類做一些改變,增加乙個instance方法。這也是對dboperator採用抽象類而不是介面的原因(介面的方法不能有實現),**如下:

public static dboperator instance(string strconnection) else //other database }

然後,客戶端**就可能是類似於下面的形式:

dboperator db= dboperator.instance(strconnection)db.open();db.需要的操作db.close();

下面來看看連線池的做法,方法就是singleton。

先看singleton模式的經典含義:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。推而廣之,當我們需要精確控制類在系統中的例項的個數的時候,就可以使用singleton模式。現在,我們需要構建乙個緩衝池,儲存資料庫類的例項,正好是singleton模式發揮作用的時候。

我們仍然讓dboperator類自己來管理這個緩衝池,為了實現這個目的,我們需要對dboperator類做一些變化:

首先,增加兩個變數:

然後,對instance方法做一些改變:

這裡使用的演算法比較簡單,只是為了能夠比較清楚地說明問題,讀者應當能夠在實際使用過程中,實現更好的演算法。

以上,介紹了一種通用資料庫操作類的實現設計方法,希望能夠對大家有所啟發。筆者設計websharp中介軟體的時候,在資料庫處理層,採用了上面的方法,取得了很好的效果。

資料訪問通用類(C )

using system using system.collections.generic using system.linq using system.web using system.data using system.data.sqlclient using system.configurat...

C 通用資料庫操作類

使用ado.net的方式運算元據庫時,對於經常需要操作不同資料庫的同學,需要對不同的資料庫翻來覆去地寫操作類。對ado.net,運算元據庫需要有幾個核心的東西 以mysql為例 負責mysql的連線,在操作mysql前,需要先獲得連線。負責具體命令的類,具體需要執行的sql的語句需要放到它的comm...

針對SQLServer資料庫的通用訪問類

web.config中 connstring connectionstring server 資料庫服務 database 資料庫名稱 uid 資料庫登入名使用者 pwd 資料庫登入密碼 現在我們先建乙個sqlhelper類,用來對資料庫的操作 如下 using system using syste...