轉(zhuǎn)帖|其它|編輯:郝浩|2010-07-20 14:53:55.000|閱讀 655 次
概述:這里,介紹一種在實(shí)際應(yīng)用中得到了非常好的效果的實(shí)作策略——筆者編寫的Websharp框架中的數(shù)據(jù)訪問結(jié)構(gòu)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在應(yīng)用程序的設(shè)計(jì)中,數(shù)據(jù)庫(kù)的訪問是非常重要的,我們通常需要將對(duì)數(shù)據(jù)庫(kù)的訪問集中起來,以保證良好的封裝性和可維護(hù)性。在.net中,數(shù)據(jù)庫(kù)的訪問,對(duì)于微軟自家的SqlServer和其他數(shù)據(jù)庫(kù)(支持OleDb),采用不同的訪問方法,這些類分別分布于System.Data.SqlClient和System.Data.OleDb名稱空間中。微軟后來又推出了專門用于訪問Oracle數(shù)據(jù)庫(kù)的類庫(kù)。我們希望在編寫應(yīng)用系統(tǒng)的時(shí)候,不因這么多類的不同而受到影響,能夠盡量做到數(shù)據(jù)庫(kù)無關(guān),當(dāng)后臺(tái)數(shù)據(jù)庫(kù)發(fā)生變更的時(shí)候,不需要更改客戶端的代碼。
這就需要我們?cè)趯?shí)際開發(fā)過程中將這些數(shù)據(jù)庫(kù)訪問類再作一次封裝。經(jīng)過這樣的封裝,不僅可以達(dá)到上述的目標(biāo),還可以減少操作數(shù)據(jù)庫(kù)的步驟,減少代碼編寫量。在這個(gè)方面,微軟為我們提供了ApplicationBlock,但是,可惜的是目前只支持SQLServer。這里,介紹一種在實(shí)際應(yīng)用中得到了非常好的效果的實(shí)作策略——筆者編寫的Websharp框架中的數(shù)據(jù)訪問結(jié)構(gòu)。Factory設(shè)計(jì)模式是使用的主要方法。
我們先來看看Factory的含義:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。FactoryMethod使一個(gè)類的實(shí)例化延遲到其子類。我們這里可能會(huì)處理對(duì)多種數(shù)據(jù)庫(kù)的操作,因此,需要首先定義一個(gè)操縱數(shù)據(jù)庫(kù)的接口,然后,根據(jù)數(shù)據(jù)庫(kù)的不同,由類工廠決定實(shí)例化哪個(gè)類。
下面,我們首先來定義這個(gè)訪問接口。為了方便說明問題,我們?cè)谶@里只列出了比較少的方法,其他的方法是很容易參照添加的。
publicinterfaceDataAccess
{
DatabaseTypeDatabaseType{get;}//數(shù)據(jù)庫(kù)類型
IDbConnectionDbConnection{get;}//得到數(shù)據(jù)庫(kù)連接
voidOpen();//打開數(shù)據(jù)庫(kù)連接
voidClose();//關(guān)閉數(shù)據(jù)庫(kù)連接
IDbTransactionBeginTransaction();//開始一個(gè)事務(wù)
intExecuteNonQuery(stringcommandText);//執(zhí)行Sql語句
DataSetExecuteDataset(stringcommandText);//執(zhí)行Sql,返回DataSet
}
因?yàn)椋珼ataAccess的具體實(shí)現(xiàn)類有一些共同的方法,所以,先從DataAccess實(shí)現(xiàn)一個(gè)抽象的AbstractDataAccess類,包含一些公用方法。然后,我們分別為SqlServer、Oracle和OleDb數(shù)據(jù)庫(kù)編寫三個(gè)數(shù)據(jù)訪問的具體實(shí)現(xiàn)類:
publicsealedclassMSSQLDataAccess:AbstractDataAccess
{
……//具體實(shí)現(xiàn)代碼。
}
publicclassOleDbDataAccess:AbstractDataAccess
{
……//具體實(shí)現(xiàn)代碼。
}
publicclassOracleDataAccess:AbstractDataAccess
{
……//具體實(shí)現(xiàn)代碼。
}
現(xiàn)在我們已經(jīng)完成了所要的功能,下面,我們需要?jiǎng)?chuàng)建一個(gè)Factory類,來實(shí)現(xiàn)自動(dòng)數(shù)據(jù)庫(kù)切換的管理。這個(gè)類很簡(jiǎn)單,主要的功能就是根據(jù)數(shù)據(jù)訪問,返回適當(dāng)?shù)臄?shù)據(jù)庫(kù)操縱類。
publicsealedclassDataAccessFactory
{
privateDataAccessFactory(){}
privatestaticPersistencePropertydefaultPersistenceProperty;
publicstaticPersistencePropertyDefaultPersistenceProperty
{
get{returndefaultPersistenceProperty;}
set{defaultPersistenceProperty=value;}
}
publicstaticDataAccessCreateDataAccess(PersistencePropertypp)
{
DataAccessdataAccess;
switch(pp.DatabaseType)
{
case(DatabaseType.MSSQLServer):
dataAccess=newMSSqlDataAccess(pp.ConnectionString);
break;
case(DatabaseType.Oracle):
dataAccess=newOracleDataAccess(pp.ConnectionString);
break;
case(DatabaseType.OleDBSupported):
dataAccess=newOleDbDataAccess(pp.ConnectionString);
break;
default:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載