【7】AccessDB快速数据访问
閱讀目錄
- C#和VB數據訪問的比較
- AccessDB的設計
- 數據庫的連接
- 三種主要操作
- 錯誤輸出及調試
- 小結
?
回到頂部C#和VB數據訪問的比較
C#中要進行一次普通的數據庫查詢,需要創建連接,再根據具體的數據庫類型,創建相關的適配器對象,再創建命令對象,執行后,將結果填入到Dataset中,用戶拿到Dataset后,再從其中的DataTable中取得數據。這種處理方式存在種種不便之處:
1、需要一系列復雜操作才能完成一個簡單功能,涉及的對象多、實現的邏輯和自然的思維習慣有所不同。
2、對不同類型的數據庫處理有所不同,用戶需要記憶不同類型數據庫之間細微的差異。
3、有些底層工作需要用戶完成,如連接有效性的檢查、出錯后連接的重建等工作。
回顧微軟的開發平臺的發展歷史,最有用戶基礎的莫過于Visual Basic了。1998年推出的VB6,在2014年的Tiobe 編程語言排行中仍在前十之列。
在VB6中,數據庫的操作可謂簡單至極,只要拖一個數據庫的控件就可以使用大多數的數據庫操作了。即使要用純代碼方式控制,也非常簡單,通過以下步驟即可完成:
上面的代碼,懶得進VB去輸入,直接手工輸入的,估計也差不離,從另一個側面也可以看出VB代碼的簡潔。習慣了這樣簡單的數據庫訪問方式,一直覺得C#中的數據庫處理方式過于復雜。正因為如此,才不斷摸索簡化數據庫訪問的手段。經過各種思路的演化,由繁到簡,最終形成一個適用性較強的、經過多次開發實踐檢驗的快速數據訪問機制AccessDB。
回到頂部AccessDB的設計
從我個人的經驗出發,回顧參與過的各種軟件開發項目,數據庫訪問的要求大同小異,用20/80法則可以很好地概況:80%的情況下,只會用到20%的功能。因此,只要能夠封裝這20%的功能,就可以適應絕大多數數據庫操作的要求了。如果恰好需要剩余的20%的話,那就按照常規的方法來訪問即可。
綜合起來,希望數據訪問機制能夠達到以下的目標:
1、足夠簡單。簡單到無需記憶。
2、適用多種數據庫。中小型應用系統采用的數據庫類型往往多變,甚至同一個項目在不同階段更換數據庫也很常見(我的習慣是用Access開發,后期換Sql Server)。因此,必須要能夠在多種常用數據庫間任意遷移。當前支持的有Access/Sqlserver/Sqlite,可以做到在切換數據庫時,只要修改連接串,代碼無需做任何改動。
3、具備擴展性。這套數據訪問機制,是隨著需求的不斷豐富,不斷重構、擴展,而變成當前的樣子的,未來可能還會不斷增加新內容。最近的一個升級,就是解決了以前web.config中配置mdb文件路徑時,必須要使用絕對路徑的問題。
基于以上的設計目標,經過不斷的總結,實現了一個以AccessDB類為核心的數據庫訪問機制。AccessDB是一個入口類,無需實例化,提供了常用的靜態方法。使用者只需記住AccessDB類名即可訪問絕大多數的數據庫功能。在整個CommonCode庫中,保持了類似的命名風格,訪問Web的入口類為AccessWeb,訪問文件的入口類為AccessFile……
AccessDB會根據初始化條件(配置文件或初始化命令)創建具體的數據訪問實體對象,如SqlserverDB、SqliteDB等。這些對象都實現了IDB接口,IDB接口的功能包括了我們常用的數據庫訪問功能。
AccessDB中直接調用IDB接口對象,執行各種操作。因為AccessDB的主要方法都是靜態方法,因此IDB對象也必須是靜態對象。換言之,在系統運行中,數據庫訪問對象只有一個。在少數特殊的情況下,需要同時操作多個數據庫,這時,可以通過直接創建IDB對象的方法,來訪問其他的數據庫。AccessDB的結構如下圖:
上圖是在VS的類圖基礎上,按類別進行了修改調整,以便看得更加一目了然。dbobject就是IDB的靜態對象,屬性和方法中的第一層方法,都是和IDB接口對應的,一方面這些方法本身就是通用性強、常用的方法,另一方面,刻意把這些方法和IDB的接口方法保持一致,這樣,用戶在自行創建SqlserverDB、SqliteDB對象時,用到的方法和AccessDB是相似的,降低了使用的復雜性。
方法中的第二類,是完成靜態連接的創建、維護、檢查錯誤等工作的,這部分代碼經過不斷的修改,已經比較健壯。也就是說,使用AccessDB開發的程序,在數據庫連接方面,是比較穩定的,不管是網站,還是桌面程序,長期運行(制作的若干網站持續運行很少因為數據庫而出問題,桌面程序中寫過一個數據采集設備的通信服務器,也可以長期運行)數據庫功能都保持正常;在中等并發節點訪問的情況下(碰到算多的情況是200左右的終端同時訪問,持續2節課)也能夠正常工作。
方法中的第三類,是常用數據操作,在本系列的另外一個帖子(【6】頁面數據和控件的自動交換機制)中,用到Add和Update以及GetEmptyRow,這些都是實際數據訪問中常用的方法。這些方法本質上還要調用標準的數據訪問接口來實現,只在AccessDB中提供這些實用數據操作,在具體的IDB中不提供這些方法。
回到頂部數據庫的連接
連接可以通過兩種方式創建,一種方式是隱式方式,即通過配置文件來控制連接的創建,一種是顯示方式,調用一個方法來完成連接的創建。
隱式方式常用于web應用程序中連接的創建,顯式方式常用于桌面應用程序中連接的創建。
1、隱式的連接
通過配置文件創建連接時,使用的數據庫連接串和普通的數據庫連接串完全一致。唯一特別的要求,是配置的連接串的鍵值必須為mainDB2。因為最早的連接串名使用了mainDB2,后來盡管不斷升級,為了和前面的代碼兼容,這個就一直沒有改變。
連接串格式兼容正常的連接串,以下是連接串的各種寫法:
2、顯式連接的創建
通過CheckConn方法可以顯式創建連接。CheckConn方法的主要作用是檢測全局的連接是否存在,如果存在,則返回,否則就根據傳遞的參數創建連接——參數就是前面提到的各種形式的連接串。CheckConn方法是建立和保持連接的主要方法,具有以下功能:
1) 如果傳遞連接串,則創建連接;
2) 如果傳遞空串,則檢查原鏈接是否有效,如果失效則使用保存的連接串重建連接;
3) 自動檢測web.config文件,根據指定的連接串創建連接;
CheckConn的實現代碼如下所示:
通過調用CreateDBObj方法來創建連接。CreateDBObj方法根據連接串中的特征信息,創建不同的IDB對象,并將連接的配置信息保存起來,便于在任何時候都可以恢復連接。
為了便于使用,兩個輔助的函數GetAccessConnectionString和GetSqlServerConnectionString,構造常見的連接串。
連接的保持,采用了被動方式進行。即不進行主動的定期檢測,而是在每次調用數據庫功能的時候進行檢測。如果遇到異常,則重建連接并重新執行操作。
回到頂部三種主要操作
1、查詢數據集
調用IDB接口對象dbobject中的GetData方法,將數據返回。
其中dbobject是根據連接所創建的具體的實現類。
2、執行非查詢操作
非查詢操作的執行和查詢一樣,都是調用IDB對象的相應方法來實現。
3、按分頁查詢
分頁功能是Web應用程序中最為常用的功能,但是,如果按照Visual Studio的分頁的方式,則每次需要查詢出所有的數據,再傳遞給顯示控件,這種處理模式在數據量龐大的時候,將會造成巨大的浪費。因此,對于分頁往往需要自行定義,每次檢索只查詢用到的那一頁數據。一般的做法,是通過存儲過程來完成,但考慮到多種數據庫的兼容,因此把分頁功能集成到快速訪問框架中。
AccessDB的GetPage同樣需要調用IDB對象的方法:
分頁的方法沒有什么特別的,都是來源于網上的,經過測試,效率還能接受而已。
回到頂部錯誤輸出及調試
AccessDB的調試非常簡單,所有重要操作都會跟蹤并輸出日志信息。日志系統采用另一篇博文提到的基于Log4Net的日志系統。
當AccessDB出錯后,可以從錯誤日志中看到詳細的信息。如果希望了解AccessDB執行的具體細節,可以通過IDB的兩個屬性OutputSelectLog、OutputNonQueryLog來控制。OutputSelectLog屬性,決定是否輸出執行的每一個Select語句;OutputNonQueryLog屬性,決定是否輸出執行的非查詢類的語句。默認情況下,二者都關閉。
回到頂部小結
以AccessDB為中心,提供了一套快速的數據庫訪問機制,通用的使用步驟如下:
1、引用CommonCode.dll,Log4Net.dll。把log4net.config復制到應用程序文件夾下。
2、初始化(web.config或者CheckConn)
3、GetData/Getpage查詢,返回DataTable
4、DoNonQuery執行查詢
5、在log文件夾下查看輸出
轉載于:https://www.cnblogs.com/jetz/p/3744925.html
總結
以上是生活随笔為你收集整理的【7】AccessDB快速数据访问的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Android多线程研究(1)——线程基
- 下一篇: 关于担当
