小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

使用設(shè)計(jì)模式構(gòu)建通用數(shù)據(jù)庫(kù)訪問(wèn)類1

 liuqg 2006-03-15

使用設(shè)計(jì)模式構(gòu)建通用數(shù)據(jù)庫(kù)訪問(wèn)類

在應(yīng)用程序的設(shè)計(jì)中,數(shù)據(jù)庫(kù)的訪問(wèn)是非常重要的,我們通常需要將對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)集中起來(lái),以保證良好的封裝性和可維護(hù)性。在.Net中,數(shù)據(jù)庫(kù)的訪問(wèn),對(duì)于微軟自家的SqlServer和其他數(shù)據(jù)庫(kù)(支持OleDb),采用不同的訪問(wèn)方法,這些類分別分布于System.Data.SqlClientSystem.Data.OleDb名稱空間中。微軟后來(lái)又推出了專門用于訪問(wèn)Oracle數(shù)據(jù)庫(kù)的類庫(kù)。我們希望在編寫應(yīng)用系統(tǒng)的時(shí)候,不因這么多類的不同而受到影響,能夠盡量做到數(shù)據(jù)庫(kù)無(wú)關(guān),當(dāng)后臺(tái)數(shù)據(jù)庫(kù)發(fā)生變更的時(shí)候,不需要更改客戶端的代碼。

這就需要我們?cè)趯?shí)際開發(fā)過(guò)程中將這些數(shù)據(jù)庫(kù)訪問(wèn)類再作一次封裝。經(jīng)過(guò)這樣的封裝,不僅可以達(dá)到上述的目標(biāo),還可以減少操作數(shù)據(jù)庫(kù)的步驟,減少代碼編寫量。在這個(gè)方面,微軟為我們提供了Application Block,但是,可惜的是目前只支持Sql Server。這里,介紹一種在實(shí)際應(yīng)用中得到了非常好的效果的實(shí)作策略——筆者編寫的Websharp框架中的數(shù)據(jù)訪問(wèn)結(jié)構(gòu)。Factory設(shè)計(jì)模式是使用的主要方法。

我們先來(lái)看看Factory的含義:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。Factory Method使一個(gè)類的實(shí)例化延遲到其子類。我們這里可能會(huì)處理對(duì)多種數(shù)據(jù)庫(kù)的操作,因此,需要首先定義一個(gè)操縱數(shù)據(jù)庫(kù)的接口,然后,根據(jù)數(shù)據(jù)庫(kù)的不同,由類工廠決定實(shí)例化哪個(gè)類。

下面,我們首先來(lái)定義這個(gè)訪問(wèn)接口。為了方便說(shuō)明問(wèn)題,我們?cè)谶@里只列出了比較少的方法,其他的方法是很容易參照添加的。

     public interface DataAccess

     {

         DatabaseType DatabaseType{get;}                  //數(shù)據(jù)庫(kù)類型

          IDbConnection DbConnection{get;}  //得到數(shù)據(jù)庫(kù)連接

         void Open();                    //打開數(shù)據(jù)庫(kù)連接

         void Close();                   //關(guān)閉數(shù)據(jù)庫(kù)連接

         IDbTransaction BeginTransaction();              //開始一個(gè)事務(wù)

         int ExecuteNonQuery(string commandText);       //執(zhí)行Sql語(yǔ)句

         DataSet ExecuteDataset(string commandText);//執(zhí)行Sql,返回DataSet

}

 

因?yàn)椋?/span>DataAccess的具體實(shí)現(xiàn)類有一些共同的方法,所以,先從DataAccess實(shí)現(xiàn)一個(gè)抽象的AbstractDataAccess類,包含一些公用方法。然后,我們分別為Sql Server、OracleOleDb數(shù)據(jù)庫(kù)編寫三個(gè)數(shù)據(jù)訪問(wèn)的具體實(shí)現(xiàn)類:

     public sealed class MSSqlDataAccess : AbstractDataAccess

     {

         ……//具體實(shí)現(xiàn)代碼。

     }

 

     public class OleDbDataAccess : AbstractDataAccess

     {

          ……//具體實(shí)現(xiàn)代碼。

     }

 

     public class OracleDataAccess : AbstractDataAccess

     {

         ……//具體實(shí)現(xiàn)代碼。

     }

 

現(xiàn)在我們已經(jīng)完成了所要的功能,下面,我們需要?jiǎng)?chuàng)建一個(gè)Factory類,來(lái)實(shí)現(xiàn)自動(dòng)數(shù)據(jù)庫(kù)切換的管理。這個(gè)類很簡(jiǎn)單,主要的功能就是根據(jù)數(shù)據(jù)庫(kù)類型,返回適當(dāng)?shù)臄?shù)據(jù)庫(kù)操縱類。

     public sealed class DataAccessFactory

     {

         private DataAccessFactory(){}

         private static PersistenceProperty defaultPersistenceProperty;

         public static PersistenceProperty DefaultPersistenceProperty

         {

              get{return defaultPersistenceProperty;}

              set{defaultPersistenceProperty=value;}

         }

         public static DataAccess CreateDataAccess(PersistenceProperty pp)

         {

              DataAccess dataAccess;

              switch(pp.DatabaseType)

              {

                   case(DatabaseType.MSSQLServer):

                       dataAccess = new MSSqlDataAccess(pp.ConnectionString);

                       break;

                   case(DatabaseType.Oracle):

                       dataAccess = new OracleDataAccess(pp.ConnectionString);

                       break;

                   case(DatabaseType.OleDBSupported):

                       dataAccess = new OleDbDataAccess(pp.ConnectionString);

                       break;

                   default:

                       dataAccess=new MSSqlDataAccess(pp.ConnectionString);

                       break;

              }

              return dataAccess;

         }

         public static DataAccess CreateDataAccess()

         {

              return CreateDataAccess(defaultPersistenceProperty);

         }

     }

 

好了,現(xiàn)在,一切都完成了,客戶端在代碼調(diào)用的時(shí)候,可能就是采用如下形式:

PersistenceProperty pp = new PersistenceProperty();

pp.ConnectionString = "server=127.0.0.1;uid=sa;pwd=;database=Northwind;";

pp.DatabaseType = DatabaseType. MSSQLServer;

pp.UserID = sa;

pp.Password = “”;

DataAccess db= DataAccessFactory.CreateDataAccess(pp)

db.Open();

……//db.需要的操作

db.Close();

 

或者,如果事先設(shè)定了DataAccessFactoryDefaultPersistenceProperty屬性,可以直接使用

DataAccess db= DataAccessFactory.CreateDataAccess()

方法創(chuàng)建DataAccess實(shí)例。

 

當(dāng)數(shù)據(jù)庫(kù)發(fā)生變化的時(shí)候,只需要修改PersistenceProperty的值,客戶端不會(huì)感覺(jué)到變化,也不用去關(guān)心。這樣,實(shí)現(xiàn)了良好的封裝性。當(dāng)然,前提是,你在編寫程序的時(shí)候,沒(méi)有用到特定數(shù)據(jù)庫(kù)的特性,例如,Sql Server的專用函數(shù)。

       以上,介紹了一種通用數(shù)據(jù)庫(kù)操作類的實(shí)現(xiàn)設(shè)計(jì)方法,希望能夠?qū)Υ蠹矣兴鶈l(fā)。全部的源代碼,可以從 www.下載,或者到 http://www./dvbbs6.0.0/index.asp 進(jìn)行討論。除了數(shù)據(jù)訪問(wèn)的源代碼,你還可以下載到全部Websharp源代碼。

 

作者:孫亞民,畢業(yè)于南京大學(xué),中國(guó)科技大學(xué)計(jì)算機(jī)技術(shù)在讀研究生,熟悉J2EE.Net平臺(tái),基于.Net平臺(tái)的Websharp開源框架的設(shè)計(jì)者。可以通過(guò) sunny@ 或者 sunny_y_m@163.com  聯(lián)系。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多