這就需要我們在實際開發(fā)過程中將這些數(shù)據(jù)庫訪問類再作一次封裝。經(jīng)過這樣的封裝,不僅可以達到上述的目標(biāo),還可以減少操作數(shù)據(jù)庫的步驟,減少代碼編寫量。在這個方面,微軟為我們提供了Application Block,但是,可惜的是目前只支持Sql Server。這里,介紹一種在實際應(yīng)用中得到了非常好的效果的實作策略——筆者編寫的Websharp框架中的數(shù)據(jù)訪問結(jié)構(gòu)。Factory設(shè)計模式是使用的主要方法。
我們先來看看Factory的含義:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。我們這里可能會處理對多種數(shù)據(jù)庫的操作,因此,需要首先定義一個操縱數(shù)據(jù)庫的接口,然后,根據(jù)數(shù)據(jù)庫的不同,由類工廠決定實例化哪個類。
下面,我們首先來定義這個訪問接口。為了方便說明問題,我們在這里只列出了比較少的方法,其他的方法是很容易參照添加的。
public interface DataAccess
{
DatabaseType DatabaseType{get;} //數(shù)據(jù)庫類型
IDbConnection DbConnection{get;} //得到數(shù)據(jù)庫連接
void Open(); //打開數(shù)據(jù)庫連接
void Close(); //關(guān)閉數(shù)據(jù)庫連接
IDbTransaction BeginTransaction(); //開始一個事務(wù)
int ExecuteNonQuery(string commandText); //執(zhí)行Sql語句
DataSet ExecuteDataset(string commandText);//執(zhí)行Sql,返回DataSet
}
因為,DataAccess的具體實現(xiàn)類有一些共同的方法,所以,先從DataAccess實現(xiàn)一個抽象的AbstractDataAccess類,包含一些公用方法。然后,我們分別為Sql Server、Oracle和OleDb數(shù)據(jù)庫編寫三個數(shù)據(jù)訪問的具體實現(xiàn)類:
public sealed class MSSqlDataAccess : AbstractDataAccess
{
……//具體實現(xiàn)代碼。
}
public class OleDbDataAccess : AbstractDataAccess
{
……//具體實現(xiàn)代碼。
}
public class OracleDataAccess : AbstractDataAccess
{
……//具體實現(xiàn)代碼。
}
現(xiàn)在我們已經(jīng)完成了所要的功能,下面,我們需要創(chuàng)建一個Factory類,來實現(xiàn)自動數(shù)據(jù)庫切換的管理。這個類很簡單,主要的功能就是根據(jù)數(shù)據(jù)庫類型,返回適當(dāng)?shù)臄?shù)據(jù)庫操縱類。
public sealed class DataAccessFactory
{
private DataAccessFactory(){}
private static PersistenceProperty defaultPersistenceProperty;
public static PersistenceProperty DefaultPersistenceProperty
{
get{return defaultPersistenceProperty;}
set{defaultPersistenceProperty=value;}
}
我們先來看看Factory的含義:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。我們這里可能會處理對多種數(shù)據(jù)庫的操作,因此,需要首先定義一個操縱數(shù)據(jù)庫的接口,然后,根據(jù)數(shù)據(jù)庫的不同,由類工廠決定實例化哪個類。
下面,我們首先來定義這個訪問接口。為了方便說明問題,我們在這里只列出了比較少的方法,其他的方法是很容易參照添加的。
public interface DataAccess
{
DatabaseType DatabaseType{get;} //數(shù)據(jù)庫類型
IDbConnection DbConnection{get;} //得到數(shù)據(jù)庫連接
void Open(); //打開數(shù)據(jù)庫連接
void Close(); //關(guān)閉數(shù)據(jù)庫連接
IDbTransaction BeginTransaction(); //開始一個事務(wù)
int ExecuteNonQuery(string commandText); //執(zhí)行Sql語句
DataSet ExecuteDataset(string commandText);//執(zhí)行Sql,返回DataSet
}
因為,DataAccess的具體實現(xiàn)類有一些共同的方法,所以,先從DataAccess實現(xiàn)一個抽象的AbstractDataAccess類,包含一些公用方法。然后,我們分別為Sql Server、Oracle和OleDb數(shù)據(jù)庫編寫三個數(shù)據(jù)訪問的具體實現(xiàn)類:
public sealed class MSSqlDataAccess : AbstractDataAccess
{
……//具體實現(xiàn)代碼。
}
public class OleDbDataAccess : AbstractDataAccess
{
……//具體實現(xiàn)代碼。
}
public class OracleDataAccess : AbstractDataAccess
{
……//具體實現(xiàn)代碼。
}
現(xiàn)在我們已經(jīng)完成了所要的功能,下面,我們需要創(chuàng)建一個Factory類,來實現(xiàn)自動數(shù)據(jù)庫切換的管理。這個類很簡單,主要的功能就是根據(jù)數(shù)據(jù)庫類型,返回適當(dāng)?shù)臄?shù)據(jù)庫操縱類。
public sealed class DataAccessFactory
{
private DataAccessFactory(){}
private static PersistenceProperty defaultPersistenceProperty;
public static PersistenceProperty DefaultPersistenceProperty
{
get{return defaultPersistenceProperty;}
set{defaultPersistenceProperty=value;}
}