數據庫訪問各種規模的應用程序不可避免的操作,.NET對提供了簡單方便統一的數據庫訪問類,並且通過Enterprise Lib提供了更為頂層的數據庫訪問庫。在我的人個工作中,現在用得最多的就是通過“動碼代碼生成器”對一次性生成數據庫訪問接口(DAL),數據工廠(DBFactory)和模型實體(Model),確實帶來了許多方便。但是使用這種結構的數據庫訪問層有一個有很有局限性,那就是當你數據庫結構改變了過后,不得不再一次重新生成上述模塊。當然我們可以用ORM(比如NH組件)實現 對象-模型的映射,通過修改配置文件來自適應這種變化。但是現在AliasDB提供了一種更加靈活自由的方式來訪問你的數據庫,通常只需配置連接字符串就可以完成基本(注意前期還只有基本的CURD功能)的數據訪問功能,但這樣通常對中小型系統,Demo,測試程序十分的有用。
首先需要說明的是,AliasDB引用了一個通用的數據庫訪問組件Maticsoft.DBUtility.dll 並修改了在此源碼的基礎上增加了部分方法(Maticsoft.DBUtility代碼主頁:http://code.google.com/p/my-project-membership/)
1.AliasDB的特性
AliasDB適用於 中小型系統,Demo,測試程序,特別是快速開發的應用程序。他提供針對MSSQL/MySQL/SQLite/Oracle數據庫的訪問方法,並用通過ODBC/OleDb支持另外的數據庫(比如Access等)。使用AliasDB的最大好處就是通過引入AliasDB,我們可以少幾行代碼就實現數據庫的增刪改查。
2.AliasDB的結構
(1)Model類
Model是繼承自Dictionary<string,object>的一個字典,它是可以代碼數據庫里任意一張表的一行,其它列名就是Model的鍵值,數據庫的值就是Model的值。通過這個松散的方式,用戶可以減少數據庫實體的編寫工作。當然,這要求您得記住數據庫里列名是什么並且代表什么意思。可解釋的數據庫列名也顯得非常重要。
(2) Maticsoft.DBUtility庫(已內置到AliasDB中)
Maticsoft.DBUtility提供的DbHelperSQL/DbHelperMySQL/DbHelperOracle/DbHelperSQLite/DbHelperOleDb等DbHelper類來幫助我們更好的訪問相應的數據庫。我在此基礎上增加了DbHelperODBC類,與其Helper類完全類似。
(3) DataAccess
所有的DataAccess類均繼承自DataAccessBase類,所有的 DataAccess在實例化時會傳入一個字符串做為構造函數,他是當前要訪問的數據表的表名,然后DataAccess在初始化時會將這個表的所有字段名和主鍵名找出來並放到內部變量中,當進行數據操作時,再將這些字符名與SQL語句進行拼接,通過Maticsoft.DBUtility完成數據庫操作。
所以AliasDB能實現自適應數據表結構的原因是,它在每一次實例化時會動態地讀取數據庫的結構(當前只有列名和主鍵),再動態的拼接數據庫。當然這也決定了AliasDB只適合於小型/簡單的數據庫,並且非常有效。
2.如何使用AliasDB
(1)引用AliasDB.dll(命名空間:Net.Superliujian.AliasDB)
(2)在app.config/web.config中的appSettings節點配置參數
<appSettings>
<add key= " TablePrefix " value= ""/>
</appSettings>
ConnectionString表示連接字符串,TablePrefix表示數據表的前綴,可以為空
(3)假設現在訪問Access數據庫的test_db中的test_table表。那么配置好連接字符串,TablePrefix可以配置成test_,使用以下方式
DataAccessOleDb da = new DataAccessOleDb("table");//TablePrex=test_,所以會訪問test_table表
// 或者 DataAccessOleDb da = new DataAccessOleDb("test_table"); // TablePrex="",da.Exists(id); // 主鍵為ID的數據是否存在
da.Update(Model m); // 更新一行數據
da.Insert(Model m); // 增加一行數據
da.InsertOrUpdate(Model m); // 更新或增加一行數據
da.Delete(id); // 刪除主鍵為ID的數據
da.DeleteList(id1,di2...); // 批量刪除
da.GetAllList(); // 得到所有數據,返回List<Model>
da.GetAllListDataSet(); // 得到所有數據,返回DataSet
da.GetList( string fields, string where); // Select,比如da.GetList("id,name","name='superliujian'")
da.GetListDataSet( string fields, string where); // Select
da.GetListByPage(string where,string order,int startIndex,int pageSize);//得到分頁數據(通過Limit)
4.AliasDB的局限性
(1)暫時只支持一個主鍵的數據表(多個聯合主鍵不支持)
(2)用戶需要記住列名
(3) 只提供基本操作,暫不支持事務
(4)Model是動態的,不是強類型(這算優點也算缺點吧)
總結:
AliasDB總的來說對於中小程序,特別是數據庫比較單一的程序是特別有效的,通常不需要做任何的設置就可以輕松完成數據庫訪問工作。雖然不適合開發商用 系統 ,但是在平明的Demo,測試等環境下有很高的開發效率,能為我們節約很多的時間。
AliasDB現已在GitHub上托管並開源,有興趣可以訪問:https://github.com/superliujian/AliasDB
后期計划:使AliasDB支持聯合主鍵、外鍵和事務操作。