分析
要做一個基於資料庫的應用程式,我們有大量的重複勞動要去做,建表,寫增 刪改查的SQL語句,寫與資料庫表對應的實體類,寫執行SQL的c#代碼,寫添加、 修改、列表、詳細頁面等等。這些活動都是圍繞著一個個都資料表來開展的, 在.NET領域有很多的OR Mapping的方案,但好多方案用起來好用,但原理很複雜 ,而且效能也不好把握,所以我們可以做一個輕型的ORM方案。有了ORM架構,根 據資料表寫c#實體類這些勞動,其實也可以寫一個代碼產生器來幫我們產生,甚 至代碼產生器還能幫我們產生一些介面的代碼。我們大概需要解決如下問題
1、我們要有一個通用的資料庫操作協助類,類似微軟的DAAB,但最好能支援 多種資料庫;
2、我們要有一個使用簡單的orm架構,能方便的用c#代碼來進行資料庫存取操 作,而且要盡量保證效能,比如使用參數化查詢;
3、我們要有一個代碼產生器協助我們解決一些重複性勞動,比如產生實體類 ,產生調用預存程序的c#代碼等;
圍繞這3個問題,我們一一來展開
一、通用的資料庫吃操作協助類
ADO.NET 2.0為我們訪問資料庫提供了一套與具體資料庫無關的模型,其核心 類是DbProviderFactory,它遵循了Provider模式,就是把對各種資料庫的操作抽 象出一個Provider,再由各種資料庫去寫與具體資料庫相關的Provider,然後通 過配置在運行時方便的切換資料庫,而盡量少的不修改商務邏輯層的代碼,業務 邏輯層依賴的是抽象的Provider。這也是典型的依賴倒置,就是說商務邏輯說我 需要哪些介面,我依賴這些介面,而讓別人去實現這些介面,在啟動並執行時候再去 載入調用實現這些介面的具體類。
為了提高效能,減少SQLSERVER執行計畫的重編譯,我們盡量使用參數化的查 詢,而一個固定的語句或者預存程序它的ADO.NET參數是固定的,所以我們可以把 這些參數緩衝起來,避免每次執行SQL語句都創新新的參數對象。另外oledb的 ado.net provider的參數是不能命名的,所以給參數賦值要按順序賦值。
為了使用方便,我們為執行SQL語句提供如下的API
public System.Data.DataSet SqlExecuteDateSet(string sql, string[] paramters, params object[] values)public System.Data.DataTable SqlExecuteDateTable(string sql, string[] paramters, params object[] values)public int SqlExecuteNonQuery(string sql, string[] paramters, params object[] values)public System.Data.Common.DbDataReader SqlExecuteReader(string sql, string[] paramters, params object[] values)public object SqlExecuteScalar(string sql, string[] paramters, params object[] values)