天天看點

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

在我們開發很多項目中,資料通路都是必不可少的,有的需要通路Oracle、SQLServer、Mysql這些正常的資料庫,也有可能通路SQLite、Access,或者一些我們可能不常用的PostgreSQL、IBM DB2、或者國産達夢資料庫等等,這些資料庫的共同特點是關系型資料庫,基本上開發的模型都差不多,不過如果我們基于ADO.NET的基礎上進行開發的話,那麼各種資料庫都有自己不同的資料庫操作對象,微軟企業庫Enterprise Library是基于這些不同資料庫的操作做的抽象模型,适合多資料庫的支援項目。本文介紹基于微軟企業庫Enterprise Library 4.1的基礎進行的多種資料庫的處理。

在選擇Enterprise Library版本的時候,我一直都是相對謹慎,因為我們開發的項目涉及很多不同的系統,有的需要XP的支援、有的需要Win7的支援或者Win10等等,需要考慮不同系統之家的相容問題,由于微軟企業庫中的資料庫通路子產品相對比較穩定,是以也基本沿用使用穩定的版本,雖然目前Enterprise Library版本為6.0,但是之前一直在項目中使用的是3.1,這個版本可以在.NET 2.0的項目上運作,而且擴充類庫也比較不錯,是以一直保留着。

是以綜合上面的原因,我們為了照顧XP、Win7/Win8/Win10等不同系統的相容性,可以從目前的Enterprise Library 3.1更新到Enterprise Library 4.1,這樣可以利用較好的擴充類庫的支援(支援支援了SQLServer、DB2、MySql、ODP.NET(Oracle)、PostgreSQL、SQLite、SqlEx等資料庫),也相對提高下該資料通路子產品的版本。

在我以前繪制的多資料庫支援裡面調整一下,把我們采用微軟企業庫後,支援的資料庫作為資料層,示意圖如下所示。

這樣基本上正常的關系型資料庫我們都支援了,我們需要開發任何資料庫應用,都是統一資料模型,開發起來友善很多了,同時也友善在不同資料庫管理系統中進行配置切換。

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

采用了微軟企業庫Enterprise Library作為我們底層的資料庫通路子產品後,對于多種資料庫的通路操作,就會統一采用這個企業庫的資料庫通路對象,操作起來非常一緻,為了對不同資料庫的正常增删改查等一些操作進行進一步的封裝,已達到簡化代碼的目的,是以我們可以為每個不同的資料庫定義一個資料通路操作基類,以便實作一些不同資料庫差異性的處理,但是它們還是有一個共同的資料通路基類。

采用不同的資料庫,我們需要為不同資料庫的通路層進行生成處理,如為SQLServer資料的表生成相關的資料通路層DALSQL,裡面放置各個表對象的内容,不過由于采用了相關的繼承類處理和基于資料庫的代碼生成,需要調整的代碼很少。

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

針對資料通路層,我們需要設計好對應的繼承關系,以便使得我們的基類能夠封裝大多數的操作,并給子類相對的彈性處理空間,如對于客戶Customer的對象,資料接口層和資料通路實作層的關系如下所示。

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

這樣整合多種資料庫支援的底層後,整個資料通路的架構設計如下所示。

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

前面我們提到,使用微軟企業庫Enterprise Library的好處就是可以統一程式設計模型,實作對多種資料庫的相容處理,而微軟企業庫Enterprise Library最大的特點是基于配置項實作多種資料庫的處理,通過對使用不同的配置項,就可以迅速切換到對應的資料庫上來,代碼不需要修改。

對于一般的企業庫配置處理,我們增加配置項如下所示。

然後為不同的資料庫添加不同的連接配接字元串

對于預設支援的SQLServer資料庫,它的連接配接字元串如下所示。

不過對于一些擴充支援的資料庫,我們還需要添加一些映射處理,如對于MySQL的支援,我們需要添加連接配接字元串:

還需要添加ProviderMappings的支援,如下所示的XML。

下面我列出所有不同資料庫的連接配接字元串以及映射關系的一個完整版本,供參考。

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

前面我們提到了,基于配置實作不同資料庫的統一處理,我們為了測試不同資料庫的連接配接,我們可以使用下面的簡單案例代碼來擷取資料進行展示。

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

其實作的代碼如下所示。

在資料庫通路項目中使用微軟企業庫Enterprise Library,實作多種資料庫的支援

我們看到,上面的代碼沒有針對具體的資料庫,是以也是非常通用的處理,我們可以直接擷取資料并展示出來,我上面案例在SQLServer、Oracle、PostgreSQL、MySQL、SQLite、Access、IBM DB2資料庫均測試通過。

具體開發項目的時候,不同資料庫有一些不同的處理,如分頁操作、擷取指定記錄的處理等等,這些我們就需要發揮上面提到的資料庫基類的功能了,通過基類功能的封裝,我們可以除了可以使用所有資料庫的共性外,還可以使用它的一些特定處理操作,這樣我們就可以充分利用各種不同資料庫的特點,但是又統一到一個開發模型上來,降低了各種不同資料庫之間開發的成本,同時也減少不同資料庫之間的遷移難度,提高代碼的可閱讀性和可擴充性。

上面關于資料庫通路子產品的架構建構,已經在我衆多的Winform項目、Web開發項目,以及一些背景服務項目上運作良好,并使用了多年,為我們開發各種不同資料庫,或者更新到不同資料庫版本的處理工作上立下了汗馬功勞。