程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 使用設計模式構建通用數據庫訪問類

使用設計模式構建通用數據庫訪問類

編輯:C#基礎知識

  在應用程序的設計中,數據庫的訪問是非常重要的,我們通常需要將對數據庫的訪問集中起來,以保證良好的封裝性和可維護性。在.Net中,數據庫的訪問,對於微軟自家的SqlServer和其他數據庫(支持OleDb),采用不同的訪問方法,這些類分別分布於System.Data.SqlClient和System.Data.OleDb名稱空間中。微軟後來又推出了專門用於訪問Oracle數據庫的類庫。我們希

  望在編寫應用系統的時候,不因這麼多類的不同而受到影響,能夠盡量做到數據庫無關,當後台數據庫發生變更的時候,不需要更改客戶端的代碼。

  這就需要我們在實際開發過程中將這些數據庫訪問類再作一次封裝。經過這樣的封裝,不僅可以達到上述的目標,還可以減少操作數據庫的步驟,減少代碼編寫量。在這個方面,微軟為我們提供了Application Block,但是,可惜的是目前只支持Sql Server。這裡,介紹一種在實際應用中得到了非常好的效果的實作策略——筆者編寫的Websharp框架中的數據訪問結構。Factory設計模式是使用的主要方法。

  我們先來看看Factory的含義:定義一個用於創建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。我們這裡可能會處理對多種數據庫的操作,因此,需要首先定義一個操縱數據庫的接口,然後,根據數據庫的不同,由類工廠決定實例化哪個類。

  下面,我們首先來定義這個訪問接口。為了方便說明問題,我們在這裡只列出了比較少的方法,其他的方法是很容易參照添加的。

  

public interface DataAccess
{
 DatabaseType DatabaseType{get;} //數據庫類型
 IDbConnection DbConnection{get;} //得到數據庫連接
 void Open(); //打開數據庫連接
 void Close(); //關閉數據庫連接
 IDbTransaction BeginTransaction(); //開始一個事務
 int ExecuteNonQuery(string commandText); //執行Sql語句
 DataSet ExecuteDataset(string commandText);//執行Sql,返回DataSet
} 

  因為,DataAccess的具體實現類有一些共同的方法,所以,先從DataAccess實現一個抽象的AbstractDataAccess類,包含一些公用方法。然後,我們分別為Sql Server、Oracle和OleDb數據庫編寫三個數據訪問的具體實現類:

  

public sealed class MSSqlDataAccess : AbstractDataAccess
{
 ……//具體實現代碼。
}
public class OleDbDataAccess : AbstractDataAccess
{
 ……//具體實現代碼。
}
public class OracleDataAccess : AbstractDataAccess
{
 ……//具體實現代碼。
} 

  現在我們已經完成了所要的功能,下面,我們需要創建一個Factory類,來實現自動數據庫切換的管理。這個類很簡單,主要的功能就是根據數據庫類型,返回適當的數據庫操縱類。

  

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);
}
}

  好了,現在,一切都完成了,客戶端在代碼調用的時候,可能就是采用如下形式:

  

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();

  或者,如果事先設定了DataAccessFactory的DefaultPersistenceProperty屬性,可以直接使用

  DataAccess db= DataAccessFactory.CreateDataAccess()方法創建DataAccess實例。

  當數據庫發生變化的時候,只需要修改PersistenceProperty的值,客戶端不會感覺到變化,也不用去關心。這樣,實現了良好的封裝性。當然,前提是,你在編寫程序的時候,沒有用到特定數據庫的特性,例如,Sql Server的專用函數。

  以上,介紹了一種通用數據庫操作類的實現設計方法,希望能夠對大家有所啟發。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved