第一講 Delphi操作數(shù)據(jù)庫(kù)基礎(chǔ)(上) |
日期:2005年3月29日 作者:心鈴 人氣: 5345 查看:[大字體 中字體 小字體] |
一、引言 編程學(xué)苑—Delphi專(zhuān)題講座從本期開(kāi)始了,心鈴在此先談?wù)勛约旱囊恍┫敕?。從年初接到?zé)任編輯的約稿之后,心鈴一直在琢磨如何寫(xiě)好本次Delphi專(zhuān)題講座,同時(shí)也參考、學(xué)習(xí)以前幾位心鈴的專(zhuān)題講座的風(fēng)格。從專(zhuān)題的選擇來(lái)說(shuō),心鈴最終選擇了“數(shù)據(jù)庫(kù)”這個(gè)專(zhuān)題,一是心鈴業(yè)余時(shí)間主要是寫(xiě)數(shù)據(jù)庫(kù)程序的,寫(xiě)數(shù)據(jù)庫(kù)專(zhuān)題比較熟悉;二是數(shù)據(jù)庫(kù)的應(yīng)用是目前最廣泛的,據(jù)統(tǒng)計(jì)約60%以上的應(yīng)用軟件都是與數(shù)據(jù)庫(kù)有關(guān)的。心鈴希望這次Delphi數(shù)據(jù)庫(kù)專(zhuān)題講座能起到拋磚引玉的作用,使得讀者能通過(guò)本次講座學(xué)習(xí)到如何編制一個(gè)完整的數(shù)據(jù)庫(kù)應(yīng)用程序,并在自己的工作、學(xué)習(xí)中得到應(yīng)用。 現(xiàn)在有關(guān)Delphi數(shù)據(jù)庫(kù)編程的書(shū)籍、資料也很多,心鈴不想東拼西湊地抄、搬一些資料來(lái)胡弄讀者,不想按照它們的如先講數(shù)據(jù)庫(kù)組件最后以一個(gè)例子來(lái)結(jié)束等風(fēng)格來(lái)寫(xiě)本次講座,也不能面面俱到地講解每個(gè)數(shù)據(jù)庫(kù)組件的屬性、方法和事件,因?yàn)檫@些知識(shí)大部分都是重復(fù)幫助文件的內(nèi)容,再者有些講了也沒(méi)多大用途,讀者可根據(jù)需要隨時(shí)從幫助文件中獲取,心鈴不想浪費(fèi)寶貴的版面。本次講座將以一個(gè)稍微復(fù)雜一點(diǎn)的數(shù)據(jù)庫(kù)應(yīng)用程序?yàn)橹骶€,將用到的數(shù)據(jù)庫(kù)組件及有關(guān)知識(shí)穿插講解,盡量做到覆蓋面廣一些,同時(shí)在講座中間可能插入一些小例子或技巧來(lái)講解一些組件重要的屬性、事件和方法等。所以,如果您習(xí)慣了一些書(shū)籍的編寫(xiě)風(fēng)格,可能會(huì)感到本次講座在組織形式上有點(diǎn)亂,但如果您能跟著講座堅(jiān)持學(xué)習(xí),相信您會(huì)有所收獲。 本次講座計(jì)劃涉及的主要內(nèi)容是:以本地?cái)?shù)據(jù)庫(kù)為主,介紹通過(guò)BDE存取數(shù)據(jù)庫(kù);通過(guò)ODBC、ADO操作數(shù)據(jù)庫(kù);SQL在數(shù)據(jù)庫(kù)中的應(yīng)用;數(shù)據(jù)庫(kù)程序的安裝制做;如果時(shí)間、版面允許會(huì)介紹一下SQL SERVER。這只是一個(gè)計(jì)劃,將根據(jù)讀者反饋意見(jiàn)、編輯要求、時(shí)間或版面的情況進(jìn)行適當(dāng)調(diào)整。本講座以目前使用廣泛的Delphi 5.0企業(yè)版為編程環(huán)境,雖然Delphi6.0已發(fā)行,心鈴的電腦中也安裝了,但可能目前用的讀者還不是太多,如果您用的是6.0版或4.0版,應(yīng)該都是可以的,只不過(guò)有些數(shù)據(jù)庫(kù)組件所在組件面板的位置不一樣。順便說(shuō)一下,寫(xiě)本次講座的心鈴只是一個(gè)業(yè)余Delphi愛(ài)好者,非專(zhuān)職程序員,對(duì)Delphi的學(xué)習(xí)不是面面面俱到,對(duì)比較熟悉的內(nèi)容也達(dá)不到非常精通的水平,所以本講座不適合高水平的讀者,適于初級(jí)和中級(jí)水平的讀者閱讀,在講座中可能會(huì)有一些錯(cuò)誤之處,希望廣大讀者能及時(shí)指出,心鈴在得到提高的同時(shí)也能使其他讀者得到正確的信息。 心鈴盡量將一些關(guān)鍵之處講解詳細(xì),使讀者能理解和明白,希望讀者能及時(shí)提出建議、意見(jiàn),將本次講座辦好,不辜負(fù)編輯的信任和讀者的期望。心鈴信箱:xinling@sweek.com,隨時(shí)準(zhǔn)備接受您的意見(jiàn)、建議或其他問(wèn)題。閱讀本講座的讀者應(yīng)已具備數(shù)據(jù)庫(kù)的基本知識(shí),如數(shù)據(jù)表、字段、字段類(lèi)型、索引等概念,對(duì)delphi本身應(yīng)該具備初級(jí)水平。 下面心鈴先談?wù)勅绾螌?xiě)一個(gè)數(shù)據(jù)庫(kù)程序。 二、如何寫(xiě)一個(gè)數(shù)據(jù)庫(kù)程序 心鈴非計(jì)算機(jī)專(zhuān)業(yè)科班出身,沒(méi)學(xué)過(guò)軟件工程等之類(lèi)的課程,這里只能從經(jīng)驗(yàn)來(lái)談?wù)勅绾尉帉?xiě)一個(gè)數(shù)據(jù)庫(kù)程序。當(dāng)然這里的有些經(jīng)驗(yàn)也適用寫(xiě)其他的程序。 第一、首先應(yīng)做一個(gè)方案。也可以說(shuō)是一個(gè)計(jì)劃、大綱之類(lèi)的東西吧,在方案中首先要根據(jù)自己或客戶(hù)的的需要把主要應(yīng)具備的功能寫(xiě)清除、寫(xiě)詳細(xì),這是很最關(guān)鍵的,否則在設(shè)計(jì)完成后發(fā)現(xiàn)有些功能由于事先沒(méi)有考慮周到再重新設(shè)計(jì)將會(huì)很麻煩的,可能有些需增加的功能容易補(bǔ)充,而有些可能由于沒(méi)有留下接口等等會(huì)造成將原來(lái)的代碼要做大量修改。其次,列出需要的輔助功能和其他一些通用功能。比如,對(duì)電腦和數(shù)據(jù)庫(kù)不熟悉的客戶(hù)一般不會(huì)提出數(shù)據(jù)庫(kù)壓縮、整理之類(lèi)的功能,但我們?cè)诔绦蛟O(shè)計(jì)中應(yīng)該考慮這些功能,還有如數(shù)據(jù)庫(kù)備份、恢復(fù)功能等;通用的一些功能如幫助文件、關(guān)于本程序等等,這些一般是任何軟件都應(yīng)該有的。最后,將數(shù)據(jù)庫(kù)結(jié)構(gòu)構(gòu)建出來(lái)。根據(jù)需要完成的功能,選擇什么樣的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)應(yīng)有幾個(gè)數(shù)據(jù)表,每個(gè)數(shù)據(jù)表應(yīng)該具備多少字段,字段的類(lèi)型、長(zhǎng)度、是否允許空值,是否建立索引等都要寫(xiě)清除。 第二、設(shè)計(jì)初步程序流程。根據(jù)要完成的功能,將大致的程序流程寫(xiě)出來(lái),每個(gè)功能都要寫(xiě)出基本流程,主要是為以后的程序編寫(xiě)起到一個(gè)指導(dǎo)作用,當(dāng)然,在實(shí)際寫(xiě)程序的過(guò)程中可能會(huì)有很多改動(dòng),但一個(gè)基本的流程會(huì)指導(dǎo)你在寫(xiě)程序時(shí)不會(huì)出現(xiàn)大的偏差。 第三、準(zhǔn)備所需資料。這里主要指的是編程所需資料,根據(jù)方案需要完成的功能分析可能需要哪些方面的資料,對(duì)非專(zhuān)職程序員來(lái)說(shuō),有些資料是不太可能記的非常牢,在寫(xiě)程序時(shí)經(jīng)常需要參考一些資料或以前編寫(xiě)的程序代碼,把這些都找來(lái),放在一個(gè)專(zhuān)用文件夾中(電子版)或放在案頭(紙介質(zhì)類(lèi)),以便于在需要時(shí)能及時(shí)查閱。當(dāng)然,如果客戶(hù)提供的資料需要在編程中使用,當(dāng)然更要準(zhǔn)備好。另外,要考慮是否有一些功能單靠編程軟件自身不好完成需要使用第三方組件或其他輔助工具,如果需要把這些組件和工具也準(zhǔn)備好。 第四、設(shè)計(jì)初步界面。根據(jù)要完成的功能,在紙上設(shè)計(jì)一個(gè)大致的界面,考慮可能用到的菜單、工具欄、狀態(tài)條,采用獨(dú)立的窗口還是MID窗口介面等,這里無(wú)需很細(xì)致的界面,因?yàn)樵趯?shí)際寫(xiě)程序中介面常常根據(jù)需要進(jìn)行調(diào)整,這里只是設(shè)計(jì)一個(gè)輪廓。 第五、分析難點(diǎn)及解決方案。即使對(duì)一個(gè)編程高手來(lái)說(shuō),寫(xiě)一個(gè)程序也會(huì)碰到一些比較困難之處。為了能比較順利完成程序設(shè)計(jì),最好根據(jù)所需功能和程序流程來(lái)對(duì)整個(gè)程序框架分析一下,根據(jù)自己掌握的知識(shí)、技能來(lái)找出某些困難之處,并找到解決方法。比如,對(duì)于比較復(fù)雜的查詢(xún),可能用一條SQL語(yǔ)句查詢(xún)得不到所需結(jié)果,你就需要分析一下如何能完成這個(gè)功能,是否采用臨時(shí)數(shù)據(jù)表來(lái)實(shí)現(xiàn),如果需要使用臨時(shí)數(shù)據(jù)表,那么如何將數(shù)據(jù)導(dǎo)出到臨時(shí)表中,這樣的SQL語(yǔ)句如果還不會(huì)寫(xiě),那么馬上查查資料看看如何實(shí)現(xiàn),最好找一個(gè)臨時(shí)數(shù)據(jù)庫(kù)來(lái)寫(xiě)幾句代碼驗(yàn)證一下看能否解決,如果解決了,可將代碼作為資料保存?zhèn)溆?。這樣通過(guò)分析,將所有可能成為難點(diǎn)之處都找出來(lái)并找到了解決方法后,在以后程序的編寫(xiě)過(guò)程中雖然可能達(dá)不到一氣呵成的程度,也應(yīng)該比較順利,總比在編程中碰到一個(gè)難點(diǎn)好幾天都無(wú)法解決而停下來(lái)要好吧!心鈴喜歡寫(xiě)程序時(shí)能一口氣完成一個(gè)功能,這樣思路流暢,寫(xiě)起來(lái)效率高,如果中間老是間斷就沒(méi)有心情了。當(dāng)然這只是心鈴的習(xí)慣做法,可能有的讀者并不喜歡這種風(fēng)格。 第六、開(kāi)始寫(xiě)程序。在上面的準(zhǔn)備工作做完之后,應(yīng)該說(shuō),到這里萬(wàn)里長(zhǎng)征已走完了三分之一,或者說(shuō)走完了一半都不夸張。因?yàn)橛辛嗣鞔_的程序流程、有了基本充足的資料、可能碰到的難點(diǎn)都找到了解決方案,我們還怕什么呢?由于事先準(zhǔn)備的比較充分,即使以后程序的編寫(xiě)過(guò)程中可能還會(huì)碰到一些困難之處,但畢竟不會(huì)出現(xiàn)很多攔路虎了,我們需要的就是拿出一大塊時(shí)間,靜下心來(lái)認(rèn)真按照方案和流程來(lái)寫(xiě)程序了。這里說(shuō)明一點(diǎn),在寫(xiě)程序之前應(yīng)該首先建立空白數(shù)據(jù)庫(kù),當(dāng)然可以在設(shè)計(jì)方案時(shí)同時(shí)建立數(shù)據(jù)庫(kù),也可以在完成前面的五步之后在正式寫(xiě)程序前建立空白數(shù)據(jù)庫(kù)。 寫(xiě)程序的幾點(diǎn)建議:由于數(shù)據(jù)庫(kù)程序和用戶(hù)的交互功能較多,用戶(hù)需要輸入的數(shù)據(jù)很多,所以必須充分考程序的錯(cuò)誤處理,對(duì)用戶(hù)可能出現(xiàn)的輸入錯(cuò)誤要充分考慮并在程序中盡量及時(shí)給出提示,在保存時(shí)對(duì)輸入數(shù)據(jù)進(jìn)行校驗(yàn),防止一些非法數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,導(dǎo)致以后的統(tǒng)計(jì)、查詢(xún)出現(xiàn)錯(cuò)誤。程序要寫(xiě)的非常健壯是很不容易的,從心鈴寫(xiě)數(shù)據(jù)庫(kù)程序的經(jīng)驗(yàn)來(lái)看,很大一部分精力都用在防止出錯(cuò)、使得程序能健壯運(yùn)行方面。一般在完成一個(gè)功能的代碼編寫(xiě)后立即進(jìn)行調(diào)試,通過(guò)后再編寫(xiě)另外一個(gè)功能的代碼,這樣可防止代碼都編寫(xiě)完畢再調(diào)試可能帶來(lái)的相互影響而弄不清除到底哪部分代碼有問(wèn)題。代碼中關(guān)鍵的地方要加些注釋?zhuān)苑酪院笞约憾伎床欢?dāng)初是怎么寫(xiě)的了。將程序代碼做好備份,免得萬(wàn)一來(lái)一次災(zāi)難而痛心疾首為什么沒(méi)及時(shí)備份代碼。 關(guān)于如何寫(xiě)一個(gè)數(shù)據(jù)庫(kù)程序就先談這么多吧,以后在講座中還會(huì)結(jié)合例子講一些,這里是僅供參考的幾點(diǎn)建議。 三、Delphi是如何操作數(shù)據(jù)庫(kù)的? 我們先來(lái)簡(jiǎn)單了解一下Delphi是如何存取數(shù)據(jù)庫(kù)的。Delphi操作數(shù)據(jù)庫(kù)主要是利用BDE(數(shù)據(jù)庫(kù)引擎)來(lái)進(jìn)行,當(dāng)然通過(guò)其他方式繞過(guò)BDE直接訪問(wèn)數(shù)據(jù)庫(kù)在Delphi中也都可以實(shí)現(xiàn),不過(guò),對(duì)于本地?cái)?shù)據(jù)庫(kù)來(lái)說(shuō),通過(guò)BDE存取數(shù)據(jù)效率還是很高的。本地?cái)?shù)據(jù)庫(kù)如果能熟練操作的話(huà),編寫(xiě)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)也很容易上手了,對(duì)普通讀者來(lái)說(shuō),寫(xiě)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)的機(jī)會(huì)還是不如單機(jī)本地?cái)?shù)據(jù)庫(kù)多,所以,本次講座的重點(diǎn)還是以本地?cái)?shù)據(jù)庫(kù)為主。 BDE是Borland Database Engine的縮寫(xiě),它是負(fù)責(zé)用戶(hù)和數(shù)據(jù)庫(kù)打交道的中間媒介。事實(shí)上,應(yīng)用程序是通過(guò)數(shù)據(jù)訪問(wèn)組件和BDE連接,再由BDE去訪問(wèn)數(shù)據(jù)庫(kù)來(lái)完成對(duì)數(shù)據(jù)庫(kù)的操作的,并非直接操作BDE。這樣用戶(hù)只需關(guān)心數(shù)據(jù)組件即可,不用去直接和BDE打交道。數(shù)據(jù)庫(kù)組件主要有數(shù)據(jù)訪問(wèn)組件和數(shù)據(jù)控制組件,它們和數(shù)據(jù)庫(kù)的關(guān)系可用下面的示意圖來(lái)表示: 用戶(hù)←→數(shù)據(jù)控制組件←→數(shù)據(jù)訪問(wèn)組件←→BDE←→數(shù)據(jù)庫(kù) 通過(guò)BDE幾乎可以操作目前所有類(lèi)型的數(shù)據(jù)庫(kù)。我們來(lái)簡(jiǎn)單了解一下常用的數(shù)據(jù)庫(kù)組件。 (一)數(shù)據(jù)訪問(wèn)組件(Data Access Component) 數(shù)據(jù)訪問(wèn)組件在組件面板的Data Access組件頁(yè)上,在這里我們簡(jiǎn)單介紹一下,Table、Query和Storedproc三個(gè)組件也稱(chēng)為數(shù)據(jù)集組件,用于和數(shù)據(jù)庫(kù)連接,讀者可將這些組件視為數(shù)據(jù)庫(kù),對(duì)它們的操作就可認(rèn)為是對(duì)數(shù)據(jù)庫(kù)的操作。 DataSource組件是數(shù)據(jù)集組件和數(shù)據(jù)控制組件的連接媒介。數(shù)據(jù)控制組件是用戶(hù)操作數(shù)據(jù)庫(kù)中數(shù)據(jù)的界面,只有通過(guò)DataSource才能和數(shù)據(jù)集組件連接,從而獲得數(shù)據(jù)用來(lái)進(jìn)行顯示、修改等操作。 Table組件是通過(guò)數(shù)據(jù)庫(kù)引擎BDE來(lái)存取數(shù)據(jù)庫(kù)中的數(shù)據(jù)的,并通過(guò)BDE將用戶(hù)對(duì)數(shù)據(jù)庫(kù)的操作如添加、刪除、修改等傳遞回?cái)?shù)據(jù)庫(kù),這是非常重要的一個(gè)組件。 Query組件是利用結(jié)構(gòu)化查詢(xún)語(yǔ)言(Structured Query Language)通過(guò) BDE來(lái)操作數(shù)據(jù)庫(kù)的,和Table組件完成的功能基本一樣,只是采用了SQL來(lái)實(shí)現(xiàn),是重要的組件之一 。 Storedproc組件是通過(guò) BDE對(duì)服務(wù)器數(shù)據(jù)庫(kù)進(jìn)行操作的,常用于客戶(hù)/服務(wù)器結(jié)構(gòu)的數(shù)據(jù)庫(kù)應(yīng)用程序。 DataBase組件一般用于建立遠(yuǎn)程的數(shù)據(jù)庫(kù)服務(wù)器--客戶(hù)/服務(wù)器結(jié)構(gòu)的數(shù)據(jù)庫(kù)應(yīng)用程序和數(shù)據(jù)庫(kù)之間的連接。 Session組件是用于控制數(shù)據(jù)庫(kù)應(yīng)用程序和數(shù)據(jù)庫(kù)連接的,主要用于復(fù)雜的功能,比如多線程數(shù)據(jù)庫(kù)程序編程。 BatchMove組件 用于大批數(shù)據(jù)的轉(zhuǎn)移、復(fù)制等。 UpdateSQL組件專(zhuān)用于只讀數(shù)據(jù)庫(kù),用于緩存數(shù)據(jù)庫(kù)的更新。 NestedTable組件通過(guò)BDE操作嵌套數(shù)據(jù)庫(kù)(一個(gè)數(shù)據(jù)庫(kù)作為一個(gè)字段保存在另一個(gè)數(shù)據(jù)庫(kù)中),和Table組件類(lèi)似,心鈴沒(méi)用過(guò)嵌套數(shù)據(jù)庫(kù),所以對(duì)此組件沒(méi)有任何使用經(jīng)驗(yàn)。 (二)數(shù)據(jù)控制組件(Data Control Component) 數(shù)據(jù)控制組件也可稱(chēng)為數(shù)據(jù)顯示組件或數(shù)據(jù)瀏覽組件。它們的主要功能是和數(shù)據(jù)訪問(wèn)組件配合供用戶(hù)對(duì)數(shù)據(jù)進(jìn)行瀏覽、編輯等操作。數(shù)據(jù)控制組件在組件板上的DataControl頁(yè)上,共有15個(gè)組件。它們分別是: DBGrid組件、DBNavigator組件、DBText組件、DBEdit組件、DBMemo組件、DBImage組件、DBListbox組件、DBComboBox組件、DBCheckBox組件、DBRadioGroup組件、DBLookupListBox組件、DBLookupComboBox組件、DBRichEdit組件、DBCtrlGrid組件、DBChart組件。這些組件使用起來(lái)都不復(fù)雜,有幾個(gè)稍復(fù)雜一點(diǎn)的以后將會(huì)講解。這里就不再逐個(gè)解釋了。 另外還有一些組件與數(shù)據(jù)庫(kù)有關(guān)。Decision Cube是一組主要用于統(tǒng)計(jì)的組件,可以表格或圖形等直觀的方式表達(dá)統(tǒng)計(jì)結(jié)果,不過(guò),似乎應(yīng)用的不是很廣泛。QReport 組件是用來(lái)最后輸出報(bào)表的組件,從很多用戶(hù)的反應(yīng)情況來(lái)看,此組件不太適合中國(guó)人報(bào)表的習(xí)慣,此組件是Borland從別的公司購(gòu)買(mǎi)的,性能上不是太好,所以現(xiàn)在用的不是太多,另有一些第三提供的報(bào)表組件很好用,也有一些國(guó)人做的報(bào)表組件,很適合中國(guó)人的習(xí)慣,所以如果最后版面允許的話(huà),將簡(jiǎn)單介紹一下這些組件的使用。 還有一個(gè)組件頁(yè)是ADO(ActiveX Data Objects),主要是使用微軟的 OLE DB 功能對(duì)在數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)進(jìn)行訪問(wèn)和操作。其主要優(yōu)點(diǎn)是易于使用、高速度、低內(nèi)存支出和占用磁盤(pán)空間較少。ADO 支持用于建立基于客戶(hù)端/服務(wù)器和 Web 的應(yīng)用程序的主要功能。ADO 同時(shí)具有遠(yuǎn)程數(shù)據(jù)服務(wù) (RDS) 功能,通過(guò) RDS 可以在一次往返過(guò)程中實(shí)現(xiàn)將數(shù)據(jù)從服務(wù)器移動(dòng)到客戶(hù)端應(yīng)用程序或 Web 頁(yè)、在客戶(hù)端對(duì)數(shù)據(jù)進(jìn)行處理然后將更新結(jié)果返回服務(wù)器的操作。ADO現(xiàn)在逐漸流行起來(lái),ADO本身也是很復(fù)雜的,微軟有專(zhuān)門(mén)的幫助文件來(lái)解釋如何使用ADO,本講座將會(huì)用一些篇幅來(lái)講解一下如何使用ADO來(lái)操作數(shù)據(jù)庫(kù)。 第一講就先到這里,在下一講中將著重介紹一下操作數(shù)據(jù)必須首先要了解的BDE的有關(guān)知識(shí)。 |
聯(lián)系客服