關(guān)于Delph連接數(shù)據(jù)庫原理(2)

字號:

這段代碼訪問了Table1中當(dāng)前記錄的名為Last Name的字段,該字段的類型為String。
     事實上,Data-Aware構(gòu)件就是通過訪問DataSet構(gòu)件的Fields屬性來使用數(shù)據(jù)的。弄明白了這一點之后,你自己也可以嘗試改寫一個常規(guī)的顯示構(gòu)件,使之具有Data-Aware的性質(zhì)。其實,大多數(shù)使用Delphi的數(shù)據(jù)庫高手并不喜歡使用Data-Aware構(gòu)件,因為Data-Aware構(gòu)件遠不用常規(guī)的構(gòu)件來得靈活。DataSet構(gòu)件除了Fields屬性之外,還具有數(shù)目眾多的特殊屬性、方法和事件,足以應(yīng)付從小型文本數(shù)據(jù)庫到大型網(wǎng)絡(luò)數(shù)據(jù)庫的所有應(yīng)用。本文不擬一一討論它們,如果讀者能將它們的運用爛熟于心的話,可以說應(yīng)付數(shù)據(jù)庫編程就不會有多大問題了。
     請將注意力再次集中到上面的結(jié)構(gòu)。在上面的結(jié)構(gòu)的最后一環(huán),可以看到BDE連接到了具體的數(shù)據(jù)庫。其實,在這一環(huán)中,也是有幾個層次的。理論上來說,BDE可以連接任何類型的數(shù)據(jù)庫。對于一些比較簡單的數(shù)據(jù)庫,例如ASCII(純文本型的數(shù)據(jù)庫)、dBase以及Delphi自己的Paradox,BDE可以直接訪問。另外它也可以通過一些相應(yīng)的驅(qū)動,訪問特定的數(shù)據(jù)庫,例如通過DAO訪問Access數(shù)據(jù)庫。對于不能直接支持的數(shù)據(jù)庫,BDE還可以連接到ODBC,通過ODBC進行訪問,雖然這樣效率比較低。
     這種性質(zhì)決定了BDE是一個相當(dāng)龐大的東西。使用了BDE的Delphi程序,必須有BDE才能工作,所以必須同BDE一起發(fā)布。這樣往往造成這樣一種情況:只有幾百K的應(yīng)用程序,在將整個BDE加入之后,體積將近10M!這對于以輕薄短小為長的文件型數(shù)據(jù)庫,簡直是一個致命的弱點。而且由于BDE要兼容太多的數(shù)據(jù)庫,本身也有不穩(wěn)定的毛病,往往出現(xiàn)令人頭疼的問題。同時,通過安裝程序安裝BDE驅(qū)動和設(shè)置數(shù)據(jù)庫別名也是一件很麻煩的事情,這一切使得BDE在Delphi程序員中很不受歡迎。在網(wǎng)上的Delphi技術(shù)論壇里,經(jīng)??梢钥吹綄DE的一片咒罵之聲……那么,有什么辦法可以繞過BDE嗎?
     有的。目前來說,至少有以下三種方法:
     (1) 使用第三方構(gòu)件。
     Inprise自己也很早就意識到了BDE的問題,雖然他們不肯放棄BDE,但是從Delphi3起,仍然對程序員提供了一個不錯的選擇:創(chuàng)建自定義的DataSet構(gòu)件。Delphi的開發(fā)者們把所有有關(guān)BDE的東西從TDataSet類中移走,放入了新的TBDEDataSet類(TBDEDataSet類是TDataSet類的子類)。TDataSet類被重新構(gòu)造,其核心功能被虛擬化。因此,你只需要從TDataSet類派生一個自己的新類,并重載一些指定的虛擬方法(用以訪問具體的數(shù)據(jù)庫),你就可以得到一個自己的DataSet構(gòu)件。它與BDE完全無關(guān),但可以象Delphi自己的DataSet構(gòu)件一樣被使用,例如,訪問其Fields屬性,乃至與Delphi的Data-Aware構(gòu)件一起工作!
     于是出現(xiàn)了大量的第三方構(gòu)件,它們可以訪問某種特定的數(shù)據(jù)庫。下面是一些比較常見的訪問文件型數(shù)據(jù)庫或ODBC的第三方構(gòu)件:
     Diamond 支持的數(shù)據(jù)庫類型 Access
     Halcyon 支持的數(shù)據(jù)庫類型 DBase/Foxpro
     Apollo 支持的數(shù)據(jù)庫類型 DBase/Foxpro
     mODBC 支持的數(shù)據(jù)庫類型 任何ODBC數(shù)據(jù)庫
     ODBC Express 支持的數(shù)據(jù)庫類型 任何ODBC數(shù)據(jù)庫
     這些控件被廣泛使用,在國內(nèi),就作者所知,財智家庭理財軟件使用了Diamond,而“追捕”(一個顯示指定IP的地址位置的共享軟件)使用了Halcyon。在使用這些第三方構(gòu)件之后,軟件終于可以“輕裝上陣”,再也不用為BDE頭疼了。
     (2) 使用ADO
     在Delphi5中,Inprise終于提供了一個比較徹底的解決方法,那就是ADO構(gòu)件。從原理上來說,ADO與上述的第三方構(gòu)件并無多大區(qū)別,只是它是Inprise官方開發(fā)的;同時,它連接的不是某個具體的數(shù)據(jù)庫,而是微軟提供的ADO對象。
     ADO(ActiveX Data Object,ActiveX數(shù)據(jù)對象)是微軟提出的新標(biāo)準(zhǔn),從理論上來,能夠支持任何類型的數(shù)據(jù)庫(甚至包括流式數(shù)據(jù))。微軟力圖將它樹為新的統(tǒng)一數(shù)據(jù)庫接口,吹噓了它的許多優(yōu)點。Inprise一直是微軟不共戴天的競爭對手,對微軟的標(biāo)準(zhǔn)嗤之以鼻(BDE即是一例),但是由于種種原因,Inprise終于承認(rèn)了ADO。平心而論,用ADO來取代BDE的確是一個不錯的解決方案,而且在Delphi中使用ADO也相當(dāng)方便。從形勢看,ADO應(yīng)該是未來的方向。但是,ADO本身也是相當(dāng)大的。
     (3) 從最底層開發(fā)一個完整的數(shù)據(jù)庫引擎。
     這是最徹底的辦法。徹底拋棄Delphi的數(shù)據(jù)庫支持,從字節(jié)開始,開發(fā)自己的數(shù)據(jù)庫。這種方法有其好處:第一,不用考慮兼容性問題,例如不用去考慮用戶的數(shù)據(jù)庫文件是Access 97格式還是Access 2000格式的;第二,可以在性能上達到最充分的優(yōu)化,因為不需要通過任何通用接口,而是直接對磁盤文件進行*作,這對于一些對性能要求苛刻的程序是很有用的;第三,能夠限度地減少冗余代碼,因為這種數(shù)據(jù)庫往往是特定格式的,而且只需要執(zhí)行一些特定的*作,訪問代碼當(dāng)然要比通用數(shù)據(jù)庫精簡得多。但這種方法的負面問題也顯而易見,那就是龐大的工作量。再簡單的數(shù)據(jù)庫也是相當(dāng)復(fù)雜的,從最底層實現(xiàn)一個完整的數(shù)據(jù)庫引擎,往往需要幾千行代碼,以及耐心和經(jīng)驗。
     雖然聽起來有些極端,但這樣做的也不乏其人。的Foxmail就是使用了自定義的數(shù)據(jù)庫格式來儲存信件、地址本等有關(guān)信息。另一個共享軟件“電子書庫”也使用了自定義的.srm格式。作者開發(fā)的iCompanion(網(wǎng)絡(luò)伴侶)也是使用自定義格式來儲存網(wǎng)絡(luò)記錄的。
     限于篇幅,這里就不再對具體的程序進行詳細的分析了。要補充的一點是,作者曾使用Diamond開發(fā)過Rich Explorer,這是一個專門用于瀏覽的大富翁論壇的離線數(shù)據(jù)庫(Access格式)的閱讀器。在作者的主頁上,可以找到Rich Explorer的全部源代碼,它完整地展示了一個使用第三方構(gòu)件訪問特定數(shù)據(jù)庫的程序(沒有使用Data-Aware控件),代碼也比較簡單,適合于初學(xué)者分析。