在應用程序的設計中
有的時候
這就需要我們在實際開發過程中將這些數據庫訪問類再作一次封裝
我們先來看看Factory的含義
下面
public abstract class DBOperator
{
public abstract IDbConnection Connection{get;} //得到數據庫連接
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
//執行Sql語句
public abstract DataSet exeSqlForDataSet(string QueryString);//執行Sql
}
然後
Sql Server的數據庫訪問類
internal class SqlDBOperator: DBOperator
{
private SqlConnection conn; //數據庫連接
private SqlTransaction trans; //事務處理類
private bool inTransaction=false; //指示當前是否正處於事務中
public override IDbConnection Connection
{
get{return nn;}
}
public SqlDBOperator(string strConnection)
{
nn= new SqlConnection(strConnection);
}
public override void Open()
{
if(conn
nn
}
public override void Close()
{
if (conn
nn
}
public override void BeginTrans()
{
trans=conn
inTransaction=true;
}
public override void CommitTrans()
{
trans
inTransaction=false;
}
public override void RollbackTrans()
{
trans
inTransaction=false;
}
public override void exeSql(string strSql
{
SqlCommand cmd=new SqlCommand();
cmd
if(inTransaction)
cmd
if((strParams!=null)&&(strParams
throw new ParamValueNotMatchException(
cmd
if(strParams!=null)
{
for(int i=
}
cmd.ExecuteNonQuery();
}
public override DataSet exeSqlForDataSet(string QueryString)
{
SqlCommand cmd=new SqlCommand();
cmd.Connection=nn ;
if(inTransaction)
cmd.Transaction=trans;
DataSet ds = new DataSet();
SqlDataAdapter ad = new SqlDataAdapter();
cmd.CommandText=QueryString;
ad.SelectCommand =cmd;
ad.Fill(ds);
return ds;
}
}
OleDb數據庫操作的類同Sql Server數據庫操作的類非常相似,只是把相應的Sql類替換成OleDb類。tW.wINgWIt.cOM需要注意的是,因為OleDb和Sql Server的參數傳遞方式不一致,所以,這裡需要做一點小小的轉換,將"@參數名"類型的參數轉換成"?",這個細節希望讀者能夠注意到。代碼如下:
internal class OleDBOperator : DBOperator
{
private OleDbConnection conn;
private OleDbTransaction trans;
private bool inTransaction=false;
public OleDBOperator(string strConnection)
{
nn= new OleDbConnection(strConnection);
}
public override IDbConnection Connection
{
get{return nn;}
}
public override void Open()
{
if(conn.State.ToString().ToUpper()!="OPEN")
nn.Open();
}
public override void Close()
{
if (conn.State.ToString().ToUpper()=="OPEN")
nn.Close();
}
public override void BeginTrans()
{
trans=conn.BeginTransaction() ;
inTransaction=true;
}
public override void CommitTrans()
{
trans.Commit();
inTransaction=false;
}
public override void RollbackTrans()
{
trans.Rollback();
inTransaction=false;
}
public override void exeSql(string strSql,string[] strParams,object[] strValues)
{
OleDbCommand cmd=new OleDbCommand();
cmd.Connection=nn ;
if(inTransaction)
cmd.Transaction=trans;
if((strParams!=null)&&(strParams.Length!=strValues.Length) )
throw new ParamValueNotMatchException("查詢參數和值不對應!");
cmd.CommandText=this.ChangeQueryString(strSql);
if(strParams!=null)
{
for(int i=0;i
}
cmd.ExecuteNonQuery();
}
public override DataSet exeSqlForDataSet(string QueryString)
{
OleDbCommand cmd=new OleDbCommand();
cmd.Connection=nn ;
if(inTransaction)
cmd.Transaction=trans;
DataSet ds = new DataSet();
OleDbDataAdapter ad = new OleDbDataAdapter();
cmd.CommandText=QueryString;
ad.SelectCommand =cmd;
ad.Fill(ds);
return ds;
}
}
現在我們已經完成了所要的功能,下面,我們需要創建一個Factory類,來實現自動數據庫切換的管理。這個類很簡單,主要的功能就是根據數據庫連接字符串,判斷使用什麼數據庫,然後,返回適當的數據庫操縱類。在這裡,判斷的方法很簡單,只是根據兩種數據庫連接字符串的不同來判斷。在實際中,隨著數據庫類的增加,判斷的方法可能會有所變化,讀者應當根據自己的實際情況來做相應的調整。
public class DBOperatorFactory
{
public static DBOperator GetDBOperator(string strConnection)
{
if(strConnection.IndexOf("provider=")<0) //SqlServer
{
return new SqlDB
From:http://tw.wingwit.com/Article/os/xtgl/201311/8590.html