因爲一個客戶朋友的需求,須要個人Winform開發框架支持國產達夢數據庫的操做,這個數據庫很早就聽過,可是真正通常項目用的不多,通常在一些特殊的項目可能須要用到。因爲個人Winform開發框架,是基於Enterprise Library的數據訪問層的實現,所以增長一個數據庫的支持很容易,本文介紹如何在框架層面上支持這種神祕的國產數據庫-達夢數據庫。sql
達夢數據庫管理系統是達夢公司推出的具備徹底自主知識產權的高性能數據庫管理系統,簡稱DM。達夢數據庫管理系統的最新版本是7.0版本,簡稱DM7。DM7提供對SQL92的特性支持以及SQL99的核心級別支持;支持多種數據庫開發接口,包括OLE DB、ADO、ODBC、OCI、JDBC、Hibernate、PHP、PDO、DB Express以及.Net DataProvider等。數據庫
達夢數據庫能夠在(http://www.dameng.com/)上下載試用,安裝好後提供不少管理工具,安裝後可讓它建立一些實例數據庫,以方便咱們瞭解數據庫的基本操做,本人對這款數據庫瞭解很少,不過它號稱支持SQL-92標準的,那麼使用起來就不會有什麼問題的,只是一些個性化的語法須要查詢便可。架構
達夢數據庫的分析器,能夠在上面執行本身的一些語句,注意它的數據庫表必須帶上一個模式前綴,相似SqlServer的dbo,不過這個是必須的。框架
個人這款基於Enterprise Library的開發框架,底層使用了微軟的數據訪問組件Enterprise Library,以適應多種數據庫類型的操做,它的分層以下所示,每一個DAL層(如DALSQL、DALOracle等)都提供了對應數據庫的實現,界面層一下的分層圖以下所示。ide
若是增長多一種數據庫,那麼咱們增長多一個Enterprise Library的組件擴展類,並在業務數據模塊裏面增長對應的DAL層便可。工具
對於具體的DALSQL這樣的數據實現層,咱們不須要把數據訪問的處理操做在所有的類裏面實現一遍,咱們能夠經過抽象類的方式,把常規的數據庫處理操做抽象到基類上面,以下所示。性能
這樣在BaseDALSQL層(SqlServer數據庫的個性化實現部分),只須要實現部分功能便可,咱們把大多數的數據庫操做,放到最頂級的數據庫訪問基類AbstractBaseDAL類上,從而是咱們可以儘量減小增長不一樣數據庫類型,須要改寫代碼的數量。測試
最終咱們增量增長一個數據訪問層就能夠實現了另一種數據庫(達夢數據庫)的實現了,具體的架構設計圖以下所示。ui
上面小節,咱們論證了框架的可擴展性,而且理論上已經具有支持達夢數據庫的擴張了,本小節介紹如何具體實現達夢數據庫的底層接入操做,並編寫一個簡單的測試例子進行測試,印證咱們的實現思路。this
咱們知道,Enterprise Library實現其餘數據庫的支持,須要增長一個組件擴展類,如EntLibContrib.Data.SQLite是用來支持SQLite數據庫的,EntLibContrib.Data.MySql是用來支持Mysql的,這個擴展類的內容也很少,主要是用來解析以下的配置文件的.
以便可以和Enterprise Library的對象進行無縫的整合,那麼咱們能夠參考MySql數據庫的擴展類EntLibContrib.Data.MySql的作法,來建立一個基於國產達夢數據庫的Enterprise Library擴展類,大概項目代碼以下所示。
這樣咱們就能夠增長配置文件以下所示,它就能正常的解析並處理了。
下面咱們來編寫測試的代碼來印證咱們的擴展類,實現Winform開發框架支持國產達夢數據庫的擴展操做。
咱們建立一個數據庫通用操做的輔助類來進行講解,代碼以下所示。
/// <summary> /// 基於Enterprise Library類庫的數據訪問測試 /// </summary> public class EntLibDmHelper { public EntLibDmHelper() { } /// <summary> /// 執行SQL查詢語句,返回查詢結果的全部記錄的第一個字段,用逗號分隔。 /// </summary> /// <param name="sql">SQL語句</param> /// <returns> /// 返回查詢結果的全部記錄的第一個字段,用逗號分隔。 /// </returns> public string SqlValueList(string sql) { Database db = DatabaseFactory.CreateDatabase(); DbCommand command = db.GetSqlStringCommand(sql); StringBuilder result = new StringBuilder(); using (IDataReader dr = db.ExecuteReader(command)) { while (dr.Read()) { result.AppendFormat("{0},", dr[0].ToString()); } } string strResult = result.ToString().Trim(','); return strResult; } /// <summary> /// 執行SQL查詢語句,返回全部記錄的DataTable集合。 /// </summary> /// <param name="sql">SQL查詢語句</param> /// <returns></returns> public DataTable SqlTable(string sql) { DataSet ds = new DataSet(); Database db = DatabaseFactory.CreateDatabase(); DbCommand command = db.GetSqlStringCommand(sql); return db.ExecuteDataSet(command).Tables[0]; } }
注意,上面的代碼沒有用到達夢的具體對象,而是使用了Enterprise Library的Database等對象來操做,這樣也就是很是方便咱們進行接口的抽象處理,能夠把更多的功能放到數據庫訪問抽象類裏面了。
若是是利用達夢的.NET Provider的對象處理數據庫,那麼具體的代碼應該是這樣的。
/// <summary> /// 執行SQL查詢語句,返回查詢結果的全部記錄的第一個字段,用逗號分隔。 /// </summary> /// <param name="sql">SQL語句</param> /// <returns> /// 返回查詢結果的全部記錄的第一個字段,用逗號分隔。 /// </returns> public string SqlValueList(string sql) { DmConnection connection = new DmConnection(ConnectionString); DmCommand cmd = new DmCommand(sql, connection); connection.Open(); StringBuilder result = new StringBuilder(); using (DmDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { result.AppendFormat("{0},", dr[0].ToString()); } } string strResult = result.ToString().Trim(','); return strResult; } /// <summary> /// 執行SQL查詢語句,返回全部記錄的DataTable集合。 /// </summary> /// <param name="sql">SQL查詢語句</param> /// <returns></returns> public DataTable SqlTable(string sql) { DataSet ds = new DataSet(); DmDataAdapter adpater = new DmDataAdapter(sql, ConnectionString); adpater.Fill(ds); return ds.Tables[0]; }
爲了方便測試,我編寫一個簡單的查詢例子來進行介紹,以下代碼所示,這裏咱們主要利用了EntLibDmHelper這個輔助類對象,也就是基於Enterprise Library的擴展的處理操做。
private void btnSearch_Click(object sender, EventArgs e) { BindData(); } private void BindData() { string condition = "1=1 "; if (this.txtAuthor.Text.Length > 0) { condition += string.Format("AND Author like '%{0}%' ", this.txtAuthor.Text); } if (this.txtName.Text.Length > 0) { condition += string.Format("AND Name like '%{0}%' ", this.txtName.Text); } if (this.txtPublisher.Text.Length > 0) { condition += string.Format("AND Publisher like '%{0}%' ", this.txtPublisher.Text); } string sql = "Select * from PRODUCTION.Product Where " + condition; EntLibDmHelper helper = new EntLibDmHelper(); //DMHelper helper = new DMHelper(); DataTable dt = helper.SqlTable(sql); this.dataGridView1.DataSource = dt; sql = "Select count(*) from PRODUCTION.Product Where " + condition; string totalCount = helper.SqlValueList(sql); this.lblCount.Text = string.Format("共有數據:{0}條", totalCount); }
最後例子運行的界面效果以下所示。
基本上印證了咱們對框架的整合,實現了支持國產達夢數據庫的擴展操做。剩下的就是咱們模仿着把BaseDALSQL這樣的基類,爲達夢數據庫增長一個個性化的數據庫處理接口,就能夠實現總體性框架的支持了。對於各個模塊 的數據訪問,咱們須要增長一個DALDM這樣的實現層,基類指向BaseDALDM這樣就能夠了。