1. Access
我們做小項目的時候特別是小的MIS系統一般也都要用數據庫來保存數據。經觀察大部分的小系統都是用Access數據庫,有的系統為了掩蓋數據庫的類型,把數據文件后綴名改了,其實只要改回到mdb,用Access打開,數據一目了然,其實Access數據庫本身有很多的問題:性能不行;數據不安全,用戶可以直接用Access打開數據庫文件進行數據修改,即使加密后都可以直接破解;Access的數據量一大,文件本身的體積就異常龐大;Access數據庫文件很容易損壞,我做的一個系統由於意外斷電老是當掉,用戶的數據幾經摧毀。 為了彌補Access的缺陷,我曾經用MySQL數據庫代替,但MySQL是網絡數據庫,安裝起來比較復雜。后來在用Python做項目的時候發現了SQLite,真是相見恨晚,SQLite就是Access理想的替代品啊!
2. SQLite
SQLite是一個小型的C程序庫,實現了獨立的,可嵌入的,零配置的SQL數據庫引擎。特性包括:
事務操作是原子,一致,孤立,並且持久的(ACID),即使在系統崩潰和電源故障之后。
零配置——不需要安裝和管理。
實現了絕大多數SQL92標准。
整個數據庫存儲在一個單一的文件中。
數據庫文件可以在不同字節序的機器之間自由地共享。
支持最大可達2T的數據庫。 (241 字節)
字符串和BLOB類型的大小最大可達 2G 字節(231字節)。
小的代碼: 完整配置的少於250KB,忽略一些可選特性的少於150KB。
在大多數常見操作上比流行的客戶/服務器數據庫引擎更快。
簡單,易於使用的API。
內建TCL綁定。 另外提供可用於許多其他語言的綁定。
具有良好注釋的源代碼,95%經過測試。
獨立:沒有外部依賴。
源代碼位於公共域。 可用於任何用途。
SQLite用的非常廣泛,Web應用也都在用它,PHP5都內置了SQLite的擴展,所以SQLite是桌面輕量級數據庫的首選。除了Access和SQLite外,還有Firebird等數據庫,我覺得SQLite足夠小系統使用了。但是SQLite是通用的數據庫系統,生成的數據庫文件很容易用二進制編輯器打開,打開后文件首部赫然就是“SQLite format 3”,這就暴露了我們的數據文件是SQLite文件,數據庫系統是SQLite,只要用SQLite工具打開這個文件就可以看到數據庫中的內容了。那為了私密性我們能做哪些工作呢?
3. SQLite定制
我們有時為了私密性,不想讓軟件用戶知道我們使用的數據庫系統可以采取不同的加密措施。Access數據庫可以設置密碼達到保護數據的目的,但是Access的密碼保存在Access的數據庫文件中,用工具可以很容易的取得數據庫的密碼,這樣我們的數據結構就很容易暴露給別人了。最安全的方法是我們自己編寫數據庫管理系統,這樣我們的數據存儲格式是私有的別人根本無法知道,這樣即使他能看到文件中的二進制數據也沒有辦法直接看到數據模型的結構。但是,自己做一個數據庫管理系統雖然不是太難,無非是存儲管理,索引管理,SQL接口等,但如果沒有相應的開發經驗還是比較費時費力的,那我們能不能用“拿來主義”,用現成的數據庫管理系統改造成我們自己的數據庫管理系統呢?當然可以。就拿SQLite來說,它是全部開源的,可以從其網站上下載到最新的源代碼,然后把源代碼修改成我們自己的格式后進行編譯就可以了。這對於Linux下的用戶來說相當容易,但對於Windows下的不太用VC、BC的開發者來說,配置編譯環境,配置導出DLL等操作還是比較費事的,我們就用現成的編譯好的文件來修改吧。
用現成編譯好的文件進行修改需要二進制的編輯器,推薦使用Ultraedit。為了更好的演示,我們假設用我比較熟悉的Delphi進行開發,用Delphi來訪問SQLite可以采用兩種方式:一種是用ODBC,SQLite提供ODBC的驅動;另外一種采用ASQLite組件進行訪問,ASQLite是專門的封裝SQLite DLL的組件包,可以在http://www.sqlite.com.cn/Upfiles/source/ASQLite.rar下載。我們選用ASQLite,對於ODBC的方法與ASQLite的類似,我們分步驟完成。
下載SQLite,可以在http://www.sqlitecn.org/download.html下載,我們下載Windows版本的,里面自帶一個命令行工具用於建庫等數據庫操作。
下載ASQLite,並安裝到Delphi中。
打開ASQLite的例子程序可以看到SQLite的演示,我們下面的修改以此例子程序為例。
ASQLite是sqlite3.dll的封裝,我們要修改的是數據庫文件、sqlite3.dll和ASQLite三個地方。
修改數據庫文件。
數據庫文件名為SampleDB,用UltraEdit打開此文件,在最上面可以看到“SQLite format 3”的字樣,這是SQLite數據文件的標識,我們只需要修改這部分就可以了,比如修改為“CrazyCom DBEN 6”,最好和原長度一樣,不一樣的后面一定要改為“00”(十六進制)。
修改sqlite3.dll。
修改完上面的數據庫文件后,如果這時運行例子程序會出現數據格式不對的提示,所以對sqlite3.dll進行相應的修改。
1)修改文件標識代碼
打開sqlite3.dll,查找“SQLite format 3”,找到后改為“CrazyCom DBEN 6”,這樣運行例子程序應該正常了。
2)修改函數導出表
我們用DLL、Exe的查看工具如Depend可以看到DLL導出了哪些函數,sqlite3.dll導出的函數都以“sqlite3_”打頭的,這就暴露了我們使用的數據庫是SQLite了,所以需要修改為不太容易辨識的名字如“crazydb_”打頭。要修改首先要找到導出表的位置,在UltraEdit中查找“sqlite3_”,當看到很多字符串都是以“sqlite3_”開始的時候就找到了,具體應該在0x39db8偏移量處。這時如果運行例子程序,例子程序會報異常,因為它找不到相應的函數入口了,所以我們必須修改ASQLite的源文件。
修改ASQLite。
ASQLite是對sqlite3.dll的組件化封裝,所有的調用還是通過sqlite3.dll實現的,既然我們修改了sqlite3.dll的導出函數接口,我們必須修改ASQLite中和sqlite3.dll的接口部分。接口文件就是ASGSQLite3.pas,打開此文件,找到TASQLite3DB.LoadLibs函數,看到了吧,這個函數加載sqlite3.dll,並找到各個函數。我們只需要修改各個函數的名稱就可以了。當然要和sqlite3.dll的導出函數名稱對應。
修改完后重新安裝ASQLite。
重新編譯例子程序,運行正常。到此已經基本完成了修改工作。
修改DLL名稱。
由於SQLite的DLL名稱是sqlite3.dll,很容易讓人猜到是SQLite,我們可以把DLL的名字改掉,具體改什么名字可以隨意,比如我們改為crazycomdb.dll。改完后要在例子程序中進行對應的修改,即設置TASQLite3DB的DriverDLL = 'crazycomdb.dll'。
4. 總結
本文給出了桌面輕量數據庫的選擇建議,比較了Access、SQLite兩種數據庫管理系統,並對定制SQLite數據庫管理系統、增強其私密性、安全性提供了詳細的步驟,給出了在Delphi下進行SQLite應用的具體例子。沒有給出ODBC驅動的相關討論,不過可以依據本文的方法類比進行。
via:http://blog.csdn.net/kernelspirit/archive/2007/03/07/1523061.aspx