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

字號(hào):

數(shù)據(jù)庫(kù)編程是Delphi大的優(yōu)勢(shì)之一,恐怕也很少有Delphi程序員沒有接觸過數(shù)據(jù)庫(kù)編程的。Delphi獨(dú)特的Data-Aware構(gòu)件,讓很多初識(shí)Delphi的人為之目瞪口呆。不需要寫任何代碼,在幾分鐘之內(nèi)就可以做出一個(gè)相當(dāng)精巧的數(shù)據(jù)庫(kù)程序,而且在開發(fā)期就可以看到運(yùn)行期的結(jié)果,這真是不可思議?。〉?,Delphi強(qiáng)大無比的數(shù)據(jù)庫(kù)開發(fā)能力,決不僅僅限于用幾個(gè)構(gòu)件*縱一下DBF或是Access數(shù)據(jù)庫(kù)而已。你所看到只是冰山一角。讓我們仔細(xì)說來。
     數(shù)據(jù)庫(kù)雖然家族龐大,但一般來說可以分為兩種:文件型數(shù)據(jù)庫(kù)和C/S型數(shù)據(jù)庫(kù)。下面分別討論。
     1 文件型數(shù)據(jù)庫(kù)
     所謂文件型數(shù)據(jù)庫(kù),顧名思義,是基于文件的(file-based),數(shù)據(jù)被按照一定格式儲(chǔ)存在磁盤里,使用時(shí)由應(yīng)用程序通過相應(yīng)的驅(qū)動(dòng)程序甚至直接對(duì)數(shù)據(jù)文件進(jìn)行讀取。也就是說,這種數(shù)據(jù)庫(kù)的訪問方式是被動(dòng)式的,只要了解其文件格式,任何程序都可以直接讀取,這樣就使得它的安全性相當(dāng)糟糕。同時(shí),在蓬勃興起的網(wǎng)絡(luò)應(yīng)用,文件型數(shù)據(jù)庫(kù)更是難有用武之地:效率低下,不支持很多SQL命令,不支持視圖、觸發(fā)器、存儲(chǔ)過程等高級(jí)功能,等等。這些特點(diǎn)決定了它不適合大型的工程。
     最為大家所熟悉的文件型數(shù)據(jù)庫(kù)可能就是DBF(DBase/Foxbase/Foxpro)數(shù)據(jù)庫(kù),在DOS時(shí)代風(fēng)靡一時(shí),相信很多人都有過抱著一本手冊(cè)苦背Foxbase命令的回憶吧!其特點(diǎn)是,每個(gè)Table或Index都是一個(gè)獨(dú)立的文件,使用相當(dāng)簡(jiǎn)單,性能還可以,安全性非常的差,但應(yīng)用非常廣泛(主要是DOS時(shí)代遺留下來的,哪個(gè)單位沒有兩個(gè)用這種東東編出來的老古董程序呢?)。它在今天還能占有一席之地,其主要原因之一是,正因?yàn)楹?jiǎn)單和使用廣泛,使得對(duì)它的訪問是最容易的,甚至根本無需第三方的接口,就可直接對(duì)其進(jìn)行字節(jié)級(jí)的讀取。
     除此之外,還有的Access數(shù)據(jù)庫(kù)。這是MS Office里的構(gòu)件之一,和DBF數(shù)據(jù)庫(kù)不同,所有的文件都被整合在一個(gè).mdb文件中,這樣就避免了數(shù)據(jù)庫(kù)變大之后管理上帶來的麻煩。同時(shí)它還提供密碼保護(hù)功能,安全性比DBF數(shù)據(jù)庫(kù)要好很多。Access數(shù)據(jù)庫(kù)除了一般的文本數(shù)據(jù)之外,還擅長(zhǎng)于對(duì)多媒體數(shù)據(jù)的處理,在對(duì)聲音、圖像乃至基于OLE的對(duì)象進(jìn)行處理時(shí),令DBF數(shù)據(jù)庫(kù)望塵莫及。隨著微軟戰(zhàn)略的步步勝利,Access數(shù)據(jù)庫(kù)也不斷發(fā)展,憑借著優(yōu)秀的性能和與MS Office的無縫結(jié)合,早已超越DBase系列,成為現(xiàn)今大的文件型數(shù)據(jù)庫(kù)了。
     Delphi中附帶的Paradox也是一種文件型數(shù)據(jù)庫(kù)。它是Inprise公司自己的產(chǎn)品。因此和Inprise的系列開發(fā)工具配合得很不錯(cuò)。它支持密碼保護(hù),支持標(biāo)準(zhǔn)的SQL,性能也還不錯(cuò),但是應(yīng)用就不那么廣泛了。和DBF數(shù)據(jù)庫(kù)一樣,它的每一個(gè)Table都是一個(gè)獨(dú)立的文件,因此也有同樣的管理問題。
     上文說到可以對(duì)文件型數(shù)據(jù)庫(kù)直接讀取,但實(shí)際編程中很少有人這么做。因?yàn)樵俸?jiǎn)單的數(shù)據(jù)庫(kù)其實(shí)也是相當(dāng)復(fù)雜的,一步步分析它的格式,從底層實(shí)現(xiàn)所有的數(shù)據(jù)庫(kù)應(yīng)用,如果都要程序員去寫的話,可能會(huì)把人累死。所以數(shù)據(jù)庫(kù)的開發(fā)商將這些訪問代碼封裝起來,向程序員開放,程序員只需要調(diào)用相應(yīng)的接口就可以了。
     以DBF為例,使用DBase/Foxbase/Foxpro系列開發(fā)工具,可以用它自己的語(yǔ)法開發(fā)出應(yīng)用程序。其中對(duì)DBF文件的具體*作被封裝了。對(duì)于Access數(shù)據(jù)庫(kù),微軟公布了一個(gè)DAO(Database Access Object),由一系列的DLL文件組成,封裝了對(duì).mdb文件的訪問。使用VB的讀者可能對(duì)DAO比較熟悉,只要在VB中嵌入DAO對(duì)象,就可以非常方便地訪問Access數(shù)據(jù)庫(kù)了。ODBC(Open DataBase Connection,開放數(shù)據(jù)庫(kù)互連)也是一種封裝,用意在于向開發(fā)人員提供一個(gè)統(tǒng)一的接口,通過這個(gè)接口可以訪問任何支持ODBC的數(shù)據(jù)庫(kù),只要該數(shù)據(jù)庫(kù)提供了相應(yīng)的ODBC驅(qū)動(dòng)。從這一點(diǎn)上來說,ODBC是一種更加高級(jí)的封裝。目前幾乎所有的主流的數(shù)據(jù)庫(kù)都能被ODBC所支持。打開你的Windows的控制面板,就可以看到ODBC的圖標(biāo)。
     用Delphi寫數(shù)據(jù)庫(kù)程序的人免不了要同BDE打交道。BDE(Borland Dasebase Engine,Borland數(shù)據(jù)庫(kù)引擎)是一個(gè)和ODBC類似的東西,orland/Inprise本來企圖用它來統(tǒng)一數(shù)據(jù)庫(kù)接口。但后來Inprise在和微軟的戰(zhàn)爭(zhēng)中敗下陣來(ODBC是微軟搞出來的),它又不肯放棄BDE,而是將其捆綁在lphi/C++Builder系列開發(fā)工具中,結(jié)果好象變成這些開發(fā)工具的一種附屬品了。
     用BDE開發(fā)數(shù)據(jù)庫(kù)程序相當(dāng)容易。許多Delphi教科書在寫到數(shù)據(jù)庫(kù)開發(fā)這一章時(shí),總是告訴你先在BDE中為某個(gè)DBF或Paradox數(shù)據(jù)庫(kù)設(shè)置一個(gè)別名,然后往窗體上放一個(gè)TTable構(gòu)件,然后將其DatabaseName指向相應(yīng)的別名……然后,這個(gè)數(shù)據(jù)庫(kù)中某個(gè)表的內(nèi)容就在相應(yīng)的Data-Aware構(gòu)件中顯示出來了。但是它們具體是怎么工作的呢?
     Delphi對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問時(shí),事實(shí)上通過了很多層次的連接。
     DataAware構(gòu)件-DataSource構(gòu)件-DataSet構(gòu)件-BDE-數(shù)據(jù)庫(kù)
     從上面結(jié)構(gòu)可以看出,BDE負(fù)責(zé)與具體的數(shù)據(jù)庫(kù)打交道,而Dataset構(gòu)件與BDE相連,DataSource構(gòu)件與Dataset構(gòu)件相連,最后才連接到顯示具體數(shù)據(jù)的Data-Aware構(gòu)件。在Delphi的構(gòu)件面板上,Data Access頁(yè)面中的構(gòu)件一般屬于DataSet構(gòu)件,例如TTable、TQuery,只要指定它們的DatabaseName屬性,就可以將它們與某個(gè)數(shù)據(jù)庫(kù)建立連接。在Data Control頁(yè)面中的構(gòu)件一般是Data-Aware構(gòu)件,例如TDBGrid,TDBEdit,TDBImage。它們的作用看上去與一般的Delphi構(gòu)件相似,不同之處在于,可以通過一個(gè)DataSource構(gòu)件作為中介,與DataSet構(gòu)件相連,并自動(dòng)顯示相應(yīng)的數(shù)據(jù)。
     用Delphi的數(shù)據(jù)庫(kù)構(gòu)件建立一個(gè)應(yīng)用程序是如此之方便,但是如果深入下去,會(huì)發(fā)現(xiàn)事情并不簡(jiǎn)單。你可以嘗試自己編寫代碼,訪問數(shù)據(jù)庫(kù)中字段,而不是通過Data-Aware構(gòu)件由用戶來編輯。如何做到這一點(diǎn)呢?秘密在于Field構(gòu)件。
     可以說,F(xiàn)ield構(gòu)件是Delphi數(shù)據(jù)庫(kù)應(yīng)用程序的基礎(chǔ) 。當(dāng)打開一個(gè)DataSet構(gòu)件時(shí),相應(yīng)的數(shù)據(jù)會(huì)被讀取,并儲(chǔ)存在TTable或TQuery構(gòu)件的Fields屬性中。這個(gè)屬性被定義為Field數(shù)組。通過直接訪問數(shù)組,可以使用它們,例如:
     Table1.Fields[0].AsInteger;
     這段代碼訪問了Table1中當(dāng)前記錄的第一個(gè)字段,該字段的類型為Integer。
     也可以通過使用FieldbyName屬性來使用它們:
     Table1.FieldbyName('Last Name').AsString;
    -