Visual Basic 的數(shù)據(jù)庫(kù)編程
作者:孫志剛
Visual Basic作為應(yīng)用程序的開(kāi)發(fā)“利器”也表現(xiàn)在數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)上,它良好的界面和強(qiáng)大的控件功能使數(shù)據(jù)庫(kù)編程變得簡(jiǎn)單多了。但即便如此,數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)仍然算得上是VB編程中的難點(diǎn),這是因?yàn)槟悴粌H要熟悉VB中關(guān)于數(shù)據(jù)庫(kù)編程方面的知識(shí)(當(dāng)然這是十分簡(jiǎn)單的)還要了解數(shù)據(jù)庫(kù)的知識(shí)。所以我們先介紹一下數(shù)據(jù)庫(kù)的基本知識(shí),算是學(xué)習(xí)數(shù)據(jù)庫(kù)編程前的熱身運(yùn)動(dòng)吧!

一、熱身運(yùn)動(dòng)
  首先需要聲明是,我們這里介紹的數(shù)據(jù)庫(kù)知識(shí)都是指的關(guān)系數(shù)據(jù)庫(kù)。所謂關(guān)系數(shù)據(jù)庫(kù)就是將數(shù)據(jù)表示為表的集合,通過(guò)建立簡(jiǎn)單表之間的關(guān)系來(lái)定義結(jié)構(gòu)的一種數(shù)據(jù)庫(kù)。
  不管表在數(shù)據(jù)庫(kù)文件中的物理存儲(chǔ)方式如何,它都可以看作一組行和列,與電子表格的行和列類似。在關(guān)系數(shù)據(jù)庫(kù)中,行被稱為記錄,而列則被稱為字段。下面是一個(gè)客戶表的例子。
  表1 客戶表
客戶號(hào) 姓名 地址 城市 街道 郵編
1723 Doe John 1234 Ffth Avenue New York NY 1004
3391 Smith Mary 9876 Myrtle Lavee Bosten MA 6078
3765 Blasel Mortimer 2296j River Road peoria IL 7011

  此表中每一行是一個(gè)記錄,它包含了特定客戶的所有信息,而每個(gè)記錄則包含了相同類型和數(shù)量的字段:客戶號(hào)、姓名等等。
  表 是一種按行與列排列的相關(guān)信息的邏輯組,類似于工作單表。
  字段 數(shù)據(jù)庫(kù)表中的每一列稱作一個(gè)字段。表是由其包含的各種字段定義的,每個(gè)字段描述了它所含有的數(shù)據(jù)。創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)時(shí),須為每個(gè)字段分配一個(gè)數(shù)據(jù)類型、最大長(zhǎng)度和其它屬性。字段可包含各種字符、數(shù)字甚至圖形。
  記錄 各個(gè)客戶有關(guān)的信息存放在表的行,被稱為記錄。一般來(lái)說(shuō),數(shù)據(jù)庫(kù)表創(chuàng)建時(shí)任意兩個(gè)記錄都不能相同。
  鍵 鍵就是表中的某個(gè)字段(或多個(gè)字段),它(們)為快速檢索而被索引。鍵可以是唯一的,也可以是非唯一的,取決于它(們)是否允許重復(fù)。唯一鍵可以指定為主鍵,用來(lái)唯一標(biāo)識(shí)表的每行。例如,在前面的例子中,客戶標(biāo)識(shí)號(hào) (客戶號(hào)) 是表的主鍵,因?yàn)榭蛻籼?hào)唯一地標(biāo)識(shí)了一個(gè)客戶。
  關(guān)系 數(shù)據(jù)庫(kù)可以由多個(gè)表組成,表與表之間可以以不同的方式相互關(guān)聯(lián)。例如,客戶數(shù)據(jù)庫(kù)還可以有一個(gè)包含某個(gè)客戶的所有定單的表。它只用“客戶號(hào)”字段來(lái)引用該定單的客戶,而不在定單表中的每項(xiàng)重復(fù)所有客戶信息,如下表所示:
  表2 定貨表

定貨 客戶號(hào) 日期 內(nèi)容 數(shù)量
14764 3391 2/23/94 27 $22.95
14932 3391 3/17/94 46 $9.57
15108 8765 2/15/96 27 $22.95

  在這個(gè)表中,客戶號(hào)字段引用了客戶表中的 客戶號(hào)字段,從而把定單和客戶聯(lián)系起來(lái)了。可以看到,客戶 3391 (Mary Smith) 在 94 年 2 月 23 日訂購(gòu)了 27 項(xiàng),在 94 年 3 月 17 日訂購(gòu)了 46 項(xiàng)。用來(lái)建立關(guān)系的鍵叫做外部鍵,因?yàn)樗c“外部”表(客戶表)的主鍵關(guān)聯(lián)。
  一對(duì)多和多對(duì)多關(guān)系 上表中的關(guān)系類型叫做一對(duì)多關(guān)系,因?yàn)橐粋(gè)客戶可以發(fā)出多個(gè)定單,而某個(gè)特定的定單只能是一個(gè)客戶所發(fā)。也可以建立多對(duì)多的關(guān)系。例如,列出所有可以銷售的項(xiàng)(存貨)的盤(pán)存表:
表3 盤(pán)存表

內(nèi)容 描述 供應(yīng)商 費(fèi)用 盤(pán)存
27 Straw Hat Garden Supply Co. $14.00 50
46 Garden gloves Garden Supply Co. $4.50 75
102 hanging floral industries $6.00 137

  從盤(pán)存表中,可以看到在客戶和存貨項(xiàng)之間存在多對(duì)多的關(guān)系。也就是說(shuō),一個(gè)客戶可以訂購(gòu)多個(gè)存貨項(xiàng),而一個(gè)存貨項(xiàng)又能夠被多個(gè)客戶訂購(gòu)。多對(duì)多關(guān)系是通過(guò)兩個(gè)獨(dú)立的一對(duì)多關(guān)系來(lái)定義的,公共的“多”表包含了兩個(gè)其它表的外部鍵。在該例中,定貨s 表與 盤(pán)存 表(通過(guò) “內(nèi)容”)與 Customer 表(通過(guò) 客戶號(hào))都相關(guān)聯(lián)。通過(guò)這三個(gè)表,我們可以看到,Mary Smith (客戶號(hào) 3391) 訂購(gòu)了 Straw Hat (“內(nèi)容” 27) 和Garden Gloves (“內(nèi)容” 46),而 Mary Smith (客戶號(hào) 3391) 和 Mortimer Blaselflatz (客戶號(hào) 8765) 都訂購(gòu)了Straw Hat (“內(nèi)容” 27)。如果把客戶表和盤(pán)存表的相關(guān)字段與 定貨表的“定貨”字段聯(lián)結(jié)起來(lái),建立一個(gè)“關(guān)聯(lián)”表,那么這個(gè)關(guān)系就更清楚了。
表4 關(guān)聯(lián)表:按客戶號(hào)和內(nèi)容排序

定貨號(hào) 客戶號(hào) 姓名 內(nèi)容 描述
14764 33391 Smith Mary 27 Straw Hat
14932 33391 Smith Mary 46 Garden Gloves
15168 8765 Blaselfatz Mortimer 27 Straw Hat

  規(guī)范化 數(shù)據(jù)庫(kù)設(shè)計(jì)者的任務(wù)就是組織數(shù)據(jù),而組織數(shù)據(jù)的方法,應(yīng)能消除不必要的重復(fù),并為所有必要信息提供快速查找路徑。為了達(dá)到這種目標(biāo)而把信息分離到各種獨(dú)立的表中去的過(guò)程,叫作規(guī)范化。
  規(guī)范化是用許多指定的規(guī)則和不同級(jí)別的范式來(lái)進(jìn)行規(guī)范的復(fù)雜過(guò)程。該過(guò)程的研討已超出了本文的范圍。但是,大多數(shù)簡(jiǎn)單數(shù)據(jù)庫(kù)的規(guī)范化可以用下面簡(jiǎn)單的經(jīng)驗(yàn)規(guī)則來(lái)完成:包含重復(fù)信息的表必須分成獨(dú)立的幾個(gè)表來(lái)消除重復(fù)。
  例如,使學(xué)生和課程對(duì)應(yīng)的學(xué)生數(shù)據(jù)庫(kù),包含了下表所示的信息。
表5

學(xué)生 課程 描述 教授
1 4 Introduction to Physiology Dawson

2 3 Applied Basketweaing Carruth
3 1 Physics for Short-定貨 cooks Adms
4 2 Introduction to Physiology Dawsons

  如果有選學(xué)了十二門(mén)課程的 1000 個(gè)學(xué)生,每門(mén)課程的說(shuō)明和教師將顯示100多次─ 對(duì)選了那門(mén)課程的每個(gè)學(xué)生都要重復(fù)一次。要避免這種低效率,應(yīng)當(dāng)把表分成兩個(gè)獨(dú)立的表來(lái)規(guī)范化,一個(gè)用來(lái)表示學(xué)生,另一個(gè)用來(lái)表示課程,如表6,表7所示。


學(xué)生 課程
1 4
2 3
3 1
4 4
  課程 描述 教授
1 Physics for Short-定貨 cooks Adms
2 Counterculture Sociology Beckely
3 Applied Basketweaing Carruth
4 Introduction to Physiology Dawsons

表6
  表7


  現(xiàn)在表被規(guī)范化了,所以,要改變特定課程的課程描述或“數(shù)據(jù)”,只要改變一個(gè)記錄就可以了。
以上是關(guān)于數(shù)據(jù)庫(kù)的基本知識(shí),這是學(xué)習(xí)數(shù)據(jù)庫(kù)編程所必須的。雖然數(shù)據(jù)庫(kù)技術(shù)作為一門(mén)學(xué)科,其深度和廣度不是這點(diǎn)篇幅能描述的,但作為入門(mén)和簡(jiǎn)單數(shù)據(jù)庫(kù)編程應(yīng)該是足夠了。
  好了,下面我們就可以開(kāi)始練練了。我們經(jīng)常遇到數(shù)據(jù)庫(kù)系統(tǒng)是登記系統(tǒng),不管你是在單位,或是參加什么組織,登記是免不了的,而且它的結(jié)構(gòu)比較簡(jiǎn)單,我們就以一個(gè)登記系統(tǒng)為例吧。分析一下該系統(tǒng)所涉及到的數(shù)據(jù)。

二、磨刀不誤砍柴功

  對(duì)于登記,要跟蹤的信息包括:
●    姓名   ●    性別
●     籍貫   ●    年齡
●    出生年月 ●    單位
●    地址   ●    郵政編碼
●    電話   ●    傳真
  當(dāng)然,可以簡(jiǎn)單地創(chuàng)建一個(gè)表,使得上述的每個(gè)數(shù)據(jù)項(xiàng)對(duì)應(yīng)一個(gè)字段。
  現(xiàn)在需要給表指派主鍵,用以唯一標(biāo)識(shí)每一條記錄,在登記表中分別添加登記號(hào)作為唯一鍵,這樣就保證數(shù)據(jù)庫(kù)中的任兩條記錄都不同了。
  對(duì)數(shù)據(jù)庫(kù)作出以上分析后,我們就可以開(kāi)始建立數(shù)據(jù)庫(kù)了。

三、建營(yíng)扎寨
  在這里我們學(xué)習(xí)怎樣建立數(shù)據(jù)庫(kù),首先需要確定要建立數(shù)據(jù)庫(kù)的類型。在Visual Basic中通過(guò)數(shù)據(jù)訪問(wèn)控件或數(shù)據(jù)訪問(wèn)對(duì)象(DAO)可以訪問(wèn)下列數(shù)據(jù)庫(kù):
  1. JET數(shù)據(jù)庫(kù),即Microsoft Access
  2. ISAM數(shù)據(jù)庫(kù),如:dBase,F(xiàn)oxPro等
  3. ODBC數(shù)據(jù)庫(kù),凡是遵循ODBC標(biāo)準(zhǔn)的客戶/服務(wù)器數(shù)據(jù)庫(kù)。如:Microsoft SQL Server、Oracle
  一般來(lái)說(shuō),如果要開(kāi)發(fā)個(gè)人的小型數(shù)據(jù)庫(kù)系統(tǒng),用Access數(shù)據(jù)庫(kù)比較合適,要開(kāi)發(fā)大、中型的數(shù)據(jù)庫(kù)系統(tǒng)用ODBC數(shù)據(jù)庫(kù)更為適宜。而dBase和FoxPro數(shù)據(jù)庫(kù)由于已經(jīng)過(guò)時(shí),除非特別的情況,否則不要使用。在我們的例子中,當(dāng)然選用Access數(shù)據(jù)庫(kù)了。建立Access數(shù)據(jù)庫(kù)有兩種方法:一是在Microsoft Access中建立數(shù)據(jù)庫(kù)。點(diǎn)擊“新建”按鈕就可以建立新的表了(如圖1)。這里我們主要介紹第二種方法:使用可視化數(shù)據(jù)管理器,不需要編程就可創(chuàng)建數(shù)據(jù)庫(kù)。可視化數(shù)據(jù)管理器是一個(gè)非常有用的應(yīng)用程序,它是VB企業(yè)版和專業(yè)版附帶的,在目錄..DevStudiovbsamplesVisdata下,其界面如下圖。
  點(diǎn)擊菜單“文件”項(xiàng)下“新建”子項(xiàng)“Microsoft ACCESS”子項(xiàng)的“版本7.0 MDB”項(xiàng)。在彈出窗口中輸入新建數(shù)據(jù)庫(kù)的名稱“登記”,出現(xiàn)下面圖3所示窗口:
  要生成新的表,右鍵單擊數(shù)據(jù)庫(kù)窗口彈出菜單,然后選擇“新表”命令,在隨后出現(xiàn)的“表結(jié)構(gòu)”對(duì)話框中建立所要的字段。每次向表中加入新的字段,單擊“增加字段”按鈕,會(huì)出現(xiàn)圖4 的“增加字段”對(duì)話框。
  “增加字段”對(duì)話框中的選項(xiàng)如表10所示,根據(jù)字段的類型,有些選項(xiàng)是無(wú)效的,無(wú)法讀取。
在我們建立的登記數(shù)據(jù)庫(kù)中,各個(gè)字段的類型如表11。

  要注意的是,由于字段登記號(hào)用來(lái)唯一標(biāo)志記錄的,因此,它不能由用戶輸入。所以在定義該字段時(shí)需要定義為L(zhǎng)ong數(shù)據(jù)類型,“自動(dòng)生成字段”項(xiàng)有效,并選中這一項(xiàng)。這樣當(dāng)用戶每輸入一條新記錄時(shí),系統(tǒng)就會(huì)在該字段上自動(dòng)輸入一個(gè)與其它記錄不同的值。
在ACCESS數(shù)據(jù)庫(kù)中,關(guān)鍵字是用索引實(shí)現(xiàn)的,作為編程人員在對(duì)表類型的記錄集編程時(shí),只需調(diào)用索引名。在查詢時(shí),Rushmore技術(shù)自動(dòng)用索引信息優(yōu)化查詢。完成表定義后,點(diǎn)擊“增加索引”按鈕,彈出如圖5所示窗口。
  在窗口中右邊有三個(gè)選項(xiàng),其意義如表 12。
  添加索引對(duì)話框選項(xiàng)
  完成之后如圖6。
  當(dāng)然,學(xué)會(huì)數(shù)據(jù)庫(kù)的建立也并非一朝一夕的事,讀者不妨多練習(xí)一下。下面你就可以運(yùn)行VB開(kāi)始我們的編程了。

四、千里相會(huì)
  Visual Basic 數(shù)據(jù)庫(kù)應(yīng)用程序有三個(gè)部分,如圖7所示。
  用戶程序是程序員開(kāi)發(fā)的,也是我們即將用VB來(lái)編寫(xiě)的部分。數(shù)據(jù)庫(kù)引擎是數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,使用它程序員可以用統(tǒng)一的格式訪問(wèn)各種數(shù)據(jù)庫(kù),不管這個(gè)數(shù)據(jù)庫(kù)是本地的 Visual Basic 數(shù)據(jù)庫(kù),還是所支持的其它任何格式的數(shù)據(jù)庫(kù)格式,所使用的數(shù)據(jù)訪問(wèn)對(duì)象和編程技術(shù)都是相同的。數(shù)據(jù)庫(kù)則是我們上面完成的部分。從這個(gè)結(jié)構(gòu)可以看出用戶與正在訪問(wèn)的特定數(shù)據(jù)庫(kù)無(wú)關(guān)。那我們?cè)谟肰B編寫(xiě)數(shù)據(jù)庫(kù)程序時(shí),就需要使程序能夠訪問(wèn)指定的數(shù)據(jù)庫(kù)。
  如果是簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用,可以使用 Data 控件來(lái)執(zhí)行大部分?jǐn)?shù)據(jù)訪問(wèn)操作,而根本不用編寫(xiě)代碼。與 Data 控件相捆綁的控件自動(dòng)顯示來(lái)自當(dāng)前記錄的一個(gè)或多個(gè)字段的數(shù)據(jù)。

DATA數(shù)據(jù)控件
屬性
CONNECT屬性 指定打開(kāi)的數(shù)據(jù)庫(kù)類型,并且包括參數(shù),如用戶和口令等。
例如:
打開(kāi)Access數(shù)據(jù)庫(kù)(缺省)
CONNECT=“ACCESS”
打開(kāi)ODBC數(shù)據(jù)庫(kù)
CONNECT=“ODBC;DATABASE=??;UID=??;PWD=??;DSN=??”
DATABASENAME屬性 確定數(shù)據(jù)控件訪問(wèn)哪一個(gè)數(shù)據(jù)庫(kù)。
對(duì)于多表數(shù)據(jù)庫(kù)它為具體的數(shù)據(jù)庫(kù)文件名,例如:ACCESS數(shù)據(jù)庫(kù)
DATABASENAME=“D:...DEMO.MDB"
  對(duì)于單表數(shù)據(jù)庫(kù)它為具體的數(shù)據(jù)庫(kù)文件所在的目錄,而具體文件名放在RECORDSOURCE屬性中,例如:訪問(wèn)FOXPRO數(shù)據(jù)庫(kù)文件D:FOXDEMO.DBF
DATABASENAME=“D:FOX”
RECORDSOURCE=“DEMO”不帶文件擴(kuò)展名
RECORDSOURCE屬性
  確定數(shù)據(jù)控件的記錄集,即:所要訪問(wèn)的數(shù)據(jù)內(nèi)容。它可以是一個(gè)表名、存儲(chǔ)查詢名或SQL語(yǔ)句。例如:訪問(wèn)Register表所有數(shù)據(jù) :
RECORDSOURCE=“Register”訪問(wèn)RC表中1973年以前出生的數(shù)據(jù):
RECORDSOURCE=“SELECT *FROM Register WHERE [BIRTHDAY]<#1/1/1973#"
注意:當(dāng)我們?cè)谶\(yùn)行時(shí)修改了該屬性后,需要調(diào)用REFRESH方法刷新記錄集。

方法
REFRESH方法 當(dāng)我們?cè)谶\(yùn)行時(shí)修改了Record-
Source屬性后,需要調(diào)用該方法刷新記錄集。
UPDATERECORD方法 將綁定在數(shù)據(jù)控件上的控件的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)中。即:當(dāng)我們修改了數(shù)據(jù)后調(diào)用該方法確定修改。
CANCELUPDATE方法 將數(shù)據(jù)庫(kù)中的數(shù)據(jù)重新讀到綁定在數(shù)據(jù)控件上的控件中。即:當(dāng)我們修改了數(shù)據(jù)后調(diào)用該方法放棄修改。

事件
  VALIDATE事件 當(dāng)我們移動(dòng)記錄集記錄指針時(shí)發(fā)生。例如:我們將記錄集記錄指針從A移動(dòng)到記錄B時(shí)當(dāng)產(chǎn)生VALIDATE事件時(shí),記錄指針仍在記錄A上。
Sub XXXX_Validate(Action As integer,Save As integer)
其中:
Action 指出如何產(chǎn)生了該事件,如:移動(dòng),增加,查詢等。
Save 表示是否保存已修改的數(shù)據(jù)。當(dāng)我們修改了綁定在數(shù)據(jù)控件的數(shù)據(jù),又沒(méi)有UPDATERECORD,則移動(dòng)指針時(shí),Save=True。如果在事件中令Save=False,則放棄修改。
例如:

Sub XXXX_Validate(Action As integer,Save As integer)
If Save then
I= MsgBox("Dada changed,Save?",vbYesNo)
If I = vbNo then
Save = False
End if
End if
End Sub

Reposition事件 當(dāng)我們移動(dòng)記錄集指針時(shí)發(fā)生。例如:我們將記錄集記錄指針從A移動(dòng)到記錄B 時(shí),當(dāng)產(chǎn)生Reposition事件時(shí),記錄指針已移動(dòng)到B上。
通常我們?cè)谠撌录酗@示當(dāng)前的指針位置。例如:
Sub XXXX_Reposition()
XXXX.Caption=??
XXXX.RecordSet.AbsolutePosition + 1
End Sub

  了解了DATA控件之后我們就可以連接數(shù)據(jù)庫(kù)了。現(xiàn)在我們可以編寫(xiě)一個(gè)應(yīng)用程序。因?yàn)殡m然我們建立了Register數(shù)據(jù)庫(kù),但是數(shù)據(jù)庫(kù)中卻沒(méi)有數(shù)據(jù),我們程序的目的就是向數(shù)據(jù)庫(kù)中輸入數(shù)據(jù)。它的運(yùn)行情況如圖8。
  各個(gè)文本框正好對(duì)應(yīng)著表Register的各個(gè)字段,在文本框中輸入數(shù)據(jù),點(diǎn)擊“增加”按鈕,就完成了一條記錄的輸入。我們看一下,DATA控件是怎樣和數(shù)據(jù)庫(kù)連接起來(lái)的,各個(gè)文本框又是怎樣和DATA控件捆綁起來(lái)的。
  在DATA控件的CONNECT屬性中,選中“ACCESS”項(xiàng),在DatabaseName屬性中,輸入“C:TEMP登記.mdb”,在RecordSource屬性中,選中“Register”,這樣就完成了數(shù)據(jù)庫(kù)與DATA控件的連接,也就是完成了與應(yīng)用程序的連接。

  數(shù)據(jù)庫(kù)中各個(gè)字段又是怎樣和文本框連接起來(lái)的呢?在VB中,我們可以將普通控件綁定在數(shù)據(jù)控件上,來(lái)完成自動(dòng)地顯示、更新記錄集的數(shù)據(jù)。常用的可綁定的控件有:Label,Text,checkBox,Image等。通過(guò)設(shè)置這些控件的DataSource和DataField屬性來(lái)完成綁定。

DataSource 屬性 表示綁定到哪一個(gè)數(shù)據(jù)控件上,程序中我們可能使用多個(gè)數(shù)據(jù)控件。
DataField 屬性 表示綁定到記錄集的哪一個(gè)記錄上。
  現(xiàn)在我們需要把Text1與表“登記”中的姓名字段連接起來(lái)。完成DATA控件的連接之后,在Text1控件的DataSource屬性中,選中“Data1”,在DataField屬性中,選中“姓名”值。用同樣的方法,將各個(gè)文本框分別綁定到對(duì)應(yīng)的字段上,就完成了文本框的捆綁。
  下面我們編寫(xiě)兩個(gè)按鈕命令,完成其相應(yīng)的操作了。喂!別著急,還有一個(gè)重要的對(duì)象沒(méi)講呢!
  當(dāng)應(yīng)用程序啟動(dòng)時(shí),Data 控件被自動(dòng)地初始化。如果 Connect、DatabaseName、Options、RecordSource、Exclusive、ReadOnly 和 RecordsetType 屬性是合法的, Microsoft Jet 數(shù)據(jù)庫(kù)引擎就會(huì)試圖創(chuàng)建一個(gè)新的基于這些屬性的 Recordset 記錄集對(duì)象。Recordset 對(duì)象可以表示表中的記錄或者作為查詢結(jié)果的記錄,使用 Recordset 對(duì)象可以在記錄一級(jí)上對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行處理。這在數(shù)據(jù)庫(kù)編程中是一個(gè)十分重要的,也是比較復(fù)雜的對(duì)象。   
  Recordset 對(duì)象有三種類型:表、動(dòng)態(tài)集、快照,它們之間存在明顯的區(qū)別。
  表類型的 Recordset 對(duì)象是指當(dāng)前數(shù)據(jù)庫(kù)中的表在創(chuàng)建表類型的記錄集時(shí),數(shù)據(jù)庫(kù)引擎打開(kāi)的表。后續(xù)的數(shù)據(jù)操作都是直接對(duì)表進(jìn)行的。只能對(duì)單個(gè)的表打開(kāi)表類型的記錄集,而不能對(duì)聯(lián)接或者聯(lián)合查詢打開(kāi)表類型的記錄集。與其它類型的 Recordset 對(duì)象相比,表類型的搜索與排序速度最快。
  動(dòng)態(tài)集類型的 Recordset 對(duì)象可以是本地的表,也可以是返回的行查詢結(jié)果。它實(shí)際上是對(duì)一個(gè)或者幾個(gè)表中的記錄的一系列引用?捎脛(dòng)態(tài)集從多個(gè)表中提取和更新數(shù)據(jù),其中包括鏈接的其它數(shù)據(jù)庫(kù)中的表。動(dòng)態(tài)集類型具有一種與眾不同的特點(diǎn):不同數(shù)據(jù)庫(kù)的可更新聯(lián)接。利用這種特性,可以對(duì)不同類型的數(shù)據(jù)庫(kù)中的表進(jìn)行可更新的聯(lián)接查詢。動(dòng)態(tài)集和它的基本表可以互相更新。如果動(dòng)態(tài)集中的記錄發(fā)生改變,同樣的變化也將在基本表中反映出來(lái)。在打開(kāi)動(dòng)態(tài)集的時(shí)候,如果其他的用戶修改了基本表,那么動(dòng)態(tài)集中也將反映出被修改過(guò)的記錄。動(dòng)態(tài)集類型是最靈活的Recordset 類型,也是功能最強(qiáng)的。不過(guò),它的搜索速度與其它操作的速度不及表類型的 Recordset。
  快照類型的 Recordset 對(duì)象包含的數(shù)據(jù)是固定的,它反映了在產(chǎn)生快照的一瞬間數(shù)據(jù)庫(kù)的狀態(tài)。從 Microsoft Jet 數(shù)據(jù)源得到的快照是不可更新的,從開(kāi)放數(shù)據(jù)庫(kù)互連 (ODBC) 數(shù)據(jù)源得到的某些快照是可以更新的,這取決于數(shù)據(jù)庫(kù)系統(tǒng)本身的能力。與動(dòng)態(tài)集類型和表類型的 Recordset 對(duì)象相比,快照的處理開(kāi)銷較少。因此,它執(zhí)行查詢和返回?cái)?shù)據(jù)的速度更快,特別是在使用 ODBC 數(shù)據(jù)源時(shí)。快照類型保存了表中所有記錄的完整復(fù)本,因此,如 果記錄的個(gè)數(shù)很多,快照的性能將比動(dòng)態(tài)集慢得多。為了確定快照與動(dòng)態(tài)集哪一個(gè)更快,可以先以動(dòng)態(tài)集方式打開(kāi)記錄集,然后再以快照方式打開(kāi)它。
  具體使用什么記錄集,取決于需要完成的任務(wù):是要更改數(shù)據(jù)呢,還是簡(jiǎn)單地查看數(shù)據(jù)。例如,如果必須對(duì)數(shù)據(jù)進(jìn)行排序或者使用索引,可以使用表。因?yàn)楸眍愋偷?Recordset 對(duì)象是做了索引的,它定位數(shù)據(jù)的速度是最快的。如果希望能夠?qū)Σ樵冞x定的一系列記錄進(jìn)行更新,可以使用動(dòng)態(tài)集。如果在特殊的情況下不能使用表類型的記錄集,或者只須對(duì)記錄進(jìn)行掃描,那么使用快照類型可能會(huì)快一些。
  一般來(lái)說(shuō),盡可能地使用表類型的 Recordset 對(duì)象,它的性能通?偸亲詈玫摹
  為選擇特定的 Recordset 類型,把 Data 控件的RecordsetType屬性設(shè)成:

RecordSet記錄集屬性
BOF屬性 當(dāng)記錄集記錄指針指向第一條記錄時(shí)返回True
EOF屬性 當(dāng)記錄集記錄指針指向最后一條記錄時(shí)返回True
AbsloutePosition屬性 返回當(dāng)前記錄集記錄指針,第一條記錄為0,是只讀屬性
Bookmark屬性 String類型,返回或設(shè)置當(dāng)前記錄集記錄指針的書(shū)簽,是可讀寫(xiě)屬性。每一條記錄都有自己唯一的書(shū)簽,它與記錄在記錄集中的順序無(wú)關(guān)。將Bookmark屬性存放到變量中,后面可以通過(guò)將該變量賦值給Bookmark屬性,并返回到這個(gè)記錄。
注意:程序中使用BookMark屬性重定位記錄指針,而不能使用Abslouteposition
NoMatch屬性 當(dāng)我們使用Find方法查詢時(shí)如果未找到則返回True。常與BookMark屬性同時(shí)使用。
例如:查找[NAME]字段中第一個(gè)姓李的人

Dim S As String
With XXXX.RecordSet
S = .BookMark
.FindFirst "[NAME] Like '李*'"
if .NoMatch then
MsgBox "數(shù)據(jù)未找到“
.BookMark = S
End if
End With

記錄集方法
AddNew方法 向記錄集增加一條新記錄
Delete方法 從記錄集中將當(dāng)前記錄刪除。在刪除后常使用MoveNext方法移動(dòng)指針。
例如:

With XXXX.RecordSet
.Delete
.MoveNext
if .EOF then .MoveLast
End With

MoveXXXX方法
MoveFirst 將記錄集指針移動(dòng)到第一條記錄上
MoveLast 將記錄集指針移動(dòng)到最后一條記錄上
MovePrevious 將記錄集指針移動(dòng)到前一條記錄上
MoveNext 將記錄集指針移動(dòng)到下一條記錄上
FindXXXX方法
FindFirst在記錄集中查詢符合條件的第一條記錄
FindLast 在記錄集中查詢符合條件的最后一條記錄
FindPrevious 在記錄集中查詢符合條件的前一條記錄
FindNext 在記錄集中查詢符合條件的下一條記錄
  好了,有了這么充分的知識(shí)了,編寫(xiě)兩個(gè)按鈕命令簡(jiǎn)直是小菜一碟,先來(lái)試一下,添一個(gè)“增加”命令按鈕吧。

Private Sub Command1_Click()
Data1.Recordset.AddNew
End Sub

  哇!怎么這么簡(jiǎn)單,再看一下“刪除”命令按鈕

Private Sub Command2_Click()
Data1.Recordset.Delete
Data1.Recordset.AddNew
End Sub

  就這樣行了嗎?運(yùn)行程序吧,OK!一切正常,迫不及待地輸入一條記錄,點(diǎn)擊“增加”按鈕,怎么?出問(wèn)題了!因?yàn)槟阒挥性谶M(jìn)行了AddNew方法后才可以輸入數(shù)據(jù),好吧,在窗口的初始化時(shí)就增加一條新記錄吧。

Private Sub Form_Initialize()
Data1.Recordset.AddNew
End Sub
  輸入完了數(shù)據(jù),我們打算退出程序,很自然的我們執(zhí)行關(guān)閉窗口操作,就順利地結(jié)束了輸入工作。真的很順利嗎?打開(kāi)數(shù)據(jù)庫(kù),看看數(shù)據(jù)庫(kù)中的數(shù)據(jù),我們發(fā)現(xiàn)剛才輸入的最后一條記錄沒(méi)有存入數(shù)據(jù)庫(kù)中。這個(gè)很好解釋,每當(dāng)我們調(diào)用AddNew方法時(shí),它就將輸入的記錄存入數(shù)據(jù)庫(kù)中,而當(dāng)我們關(guān)閉窗口時(shí),剛輸入的記錄并沒(méi)有保存到數(shù)據(jù)庫(kù)中,那么在關(guān)閉窗口之前對(duì)DATA控件進(jìn)行一次刷新就可以將數(shù)據(jù)存入數(shù)據(jù)庫(kù)中了。

Private Sub Form_QueryUnload(Cancel As Inte              ger, UnloadMode As Integer)
Data1.Refresh
End Sub

  到了這里,我們似乎可以稍稍輕松了一點(diǎn),這個(gè)窗口的功能差不多完成了。但是我不得不給你提出一個(gè)忠告:在數(shù)據(jù)庫(kù)系統(tǒng)中,應(yīng)盡量將錯(cuò)誤在應(yīng)用級(jí)上處理。這句話看起來(lái)似乎有點(diǎn)抽象,實(shí)際上用在這個(gè)程序中就簡(jiǎn)單多了。在表Register中,我們將出生日期定義為Date/Time類型,如果在程序運(yùn)行時(shí),在該字段對(duì)應(yīng)的文本框中輸入的不是Date/Time格式,在向數(shù)據(jù)庫(kù)提交數(shù)據(jù)時(shí)會(huì)出現(xiàn)什么情況呢?數(shù)據(jù)庫(kù)會(huì)向用戶報(bào)告錯(cuò)誤信息。然而這樣對(duì)應(yīng)用程序并不好,這樣的錯(cuò)誤應(yīng)該由用戶程序處理,而不是交給數(shù)據(jù)庫(kù)去處理,所以在數(shù)據(jù)提交之前就應(yīng)該檢查該字段的輸入是否合法。

Private Sub Text3_LostFocus()
If IsDate(Text3.Text) Or Text3.Text = "" Then          '檢查是否輸入合法數(shù)據(jù)
Exit Sub
End If
MsgBox ("輸入錯(cuò)誤,請(qǐng)輸入你出生的年月日!")
,將選取不合法的數(shù)據(jù),以便重新輸入,并使控制焦點(diǎn)不動(dòng)
Text3.SetFocus
Text3.SelStart = 0
Text3.SelLength = Len(Text3.Text)
End Sub

  上面雖是應(yīng)用程序處理錯(cuò)誤的一個(gè)小例子,可是這種在應(yīng)用級(jí)處理錯(cuò)誤的思想是十分重要的。

五、尋尋覓覓
  在數(shù)據(jù)庫(kù)管理系統(tǒng)中,輸入和查詢就象兩個(gè)孿生姐妹不可或缺,下面將介紹如何創(chuàng)建查詢窗口。查詢窗口的設(shè)計(jì)分為兩部分:查詢結(jié)果和查詢條件。查詢結(jié)果是指用戶所需要的數(shù)據(jù),它包括根據(jù)查詢條件查詢出來(lái)的記錄,但并非表中每個(gè)字段里的數(shù)據(jù)都需要提供給用戶。比如在我們這個(gè)例子中,登記表中的登記號(hào)的值是用戶不感興趣的,所以在查詢結(jié)果中,我們不希望顯示RegID字段的值。查詢條件是用戶提出的查詢要求。比如在我們這個(gè)系統(tǒng)中,可以有姓名條件,當(dāng)用戶想知道某個(gè)人的具體情況,他可以輸入此人的姓名,就查詢出此人各方面的情況;也可以有年齡條件,當(dāng)用戶輸入某個(gè)年齡段,就會(huì)查詢出處于這個(gè)年齡段的所有人的信息。到底采用哪些查詢條件,這需要開(kāi)發(fā)者根據(jù)用戶和系統(tǒng)的要求進(jìn)行設(shè)計(jì),其具體實(shí)現(xiàn)過(guò)程大都大同小異。為了節(jié)省篇幅,我們就僅以年齡為條件進(jìn)行查詢。查詢窗口運(yùn)行情況如圖9。
在這個(gè)程序中我們使用了一個(gè)控件DBGrid,這個(gè)控件用來(lái)顯示查詢結(jié)果,選中VB的“工程”菜單下的“部件……”項(xiàng),在控件標(biāo)簽中,選中“Microsoft Data Bound Grid Control 5.0”即可,在工具箱中就會(huì)出現(xiàn)DBGrid控件的小圖標(biāo)。其使用和其它控件一樣。
  為了和數(shù)據(jù)庫(kù)連接,DATA控件是不可少的,回憶一下,該怎樣設(shè)置它的屬性,OK!同輸入窗口一樣,在CONNECT屬性中,選中“ACCESS”項(xiàng)。在DatabaseName屬性中,輸入“C:TEMP登記.mdb”。在RecordSource屬性中,選中......嘿,嘿,這里稍微有點(diǎn)不同,如果按輸入窗口那樣的設(shè)置,查詢結(jié)果中就會(huì)包含登記號(hào)字段了。在此屬性中我們應(yīng)該輸入SQL語(yǔ)句:
  select name as 姓名,sex as 性別,hometown as 籍貫,age as 年齡,birthday as 生日,company as 單位,address as 地址,zip as 郵編,telephone as 電話,fax as 傳真 from Register。別著急,盡管這條語(yǔ)句有點(diǎn)長(zhǎng),實(shí)際上卻比較簡(jiǎn)單。這條語(yǔ)句的語(yǔ)法是:
  SELECT 字段名,字段名,……FROM 表名 WHERE 條件;
  對(duì)照語(yǔ)法,我們可以看出輸入的SQL語(yǔ)句的含義:從表Register中查詢姓名,性別,籍費(fèi),……字段的值。只要在字段列表中不選中登記號(hào)字段,在查詢結(jié)果中,就不會(huì)顯示登記號(hào)的值了。如果你夠細(xì)心的話就會(huì)注意到我們所寫(xiě)的SQL語(yǔ)句中在字段列表中并不僅僅輸入字段名,在其后面還增加了as……項(xiàng),如“name as 姓名”,這是為name字段取一個(gè)別名“姓名”,以便在DBGrid控件中顯示字段名時(shí),就會(huì)顯示“姓名”而不是“name”。
  完成了DATA控件屬性的設(shè)置就可以將DBGrid控件捆綁到DATA控件上,其方法同輸入窗口。對(duì)了,將“DataSource”屬性設(shè)置為“DATA1”即可,F(xiàn)在不妨運(yùn)行一下程序,真令人興奮,DBGrid顯示出表中所有的信息。可是怎樣顯示符合條件的數(shù)據(jù)呢?再看一看上面的SQL語(yǔ)法,WHERE段后可以輸入查詢條件,比如:需要年齡在20到30歲之間的人員信息,其語(yǔ)句為:Select name,... From register where age>20 and age<30;
  我們只要根據(jù)用戶輸入的條件構(gòu)成新的SQL語(yǔ)句,并利用DATA控件的Refrensh方法刷新數(shù)據(jù)庫(kù),就可以完成條件查詢了。
  整個(gè)程序十分簡(jiǎn)單,當(dāng)用戶在文本框中輸入年齡段后,點(diǎn)按“查詢”命令,就會(huì)顯示符合條件的查詢結(jié)果。程序代碼如下:

Option Explicit
Const allinfo = "select name as 姓名,sex as 性別,hometown as 籍貫,age as 年齡,birthday as 生日,company as 單位,address as 地址,zip as 郵編,telephone as 電話,fax as 傳真 from 登記" '定義不帶條件的SQL查詢語(yǔ)句

Private Sub Command1_Click()
Dim t1, m, n As String
'構(gòu)造SQL語(yǔ)句的WHERE條件段
If IsNumeric(Text1.Text) Then
m = " age >" + Text1.Text
End If
If IsNumeric(Text2.Text) Then
n = " age < " + Text2.Text
End If
If m = "" And n = "" Then
t1 = ""
Else
If m = "" Then
t1 = n
Else
If n = "" Then
t1 = m
Else
t1 = m + " and " + n
End If
End If
End If
If t1 <> "" Then
t1 = " where " + t1
End If
Data1.RecordSource = allinfo + t1
'將RecordSource屬性的值設(shè)置為新的SQL語(yǔ)句
Data1.Refresh
‘刷新數(shù)據(jù)庫(kù),獲得符合當(dāng)前條件的查詢結(jié)果
End Sub

  在這個(gè)程序中,你還可以加上姓名查詢、籍貫查詢等,其設(shè)計(jì)過(guò)程都是通過(guò)構(gòu)造SQL語(yǔ)句來(lái)實(shí)現(xiàn)的。另外,還需要注意的一點(diǎn)是既然是查詢窗口,當(dāng)然允許修改,將DBGrid控件的AllowUpdate屬性值設(shè)為False。OK!運(yùn)行程序吧,!萬(wàn)事大吉。看一看應(yīng)用程序,再看一看你編寫(xiě)的代碼,不可思議,這么短的代碼居然完成了這么強(qiáng)大的功能。事實(shí)就是這樣,數(shù)據(jù)庫(kù)編程中最重要的是對(duì)概念的清楚,與之相比,技巧好象擺在了次要位置。讓我們閉上眼睛,想一想我們需要了解那些東西吧:DATA控件,RECORDSET對(duì)象、控件的捆綁、簡(jiǎn)單的SQL查詢語(yǔ)句。熟悉了這些東西,你就可以進(jìn)行數(shù)據(jù)庫(kù)編程了,如果你對(duì)開(kāi)發(fā)數(shù)據(jù)庫(kù)系統(tǒng)比較感興趣,可以再加強(qiáng)一下在數(shù)據(jù)庫(kù)設(shè)計(jì)和SQL語(yǔ)句方面的知識(shí)。但數(shù)據(jù)庫(kù)編程真的總是這樣簡(jiǎn)單嗎?如果已經(jīng)熟悉了上面的內(nèi)容,建議你看一下下面這一節(jié)。

六、撥云見(jiàn)霧
  還記得我們?cè)谇懊嬲f(shuō)過(guò)Visual Basic 提供了兩種與 Jet 數(shù)據(jù)庫(kù)引擎接口的方法嗎?Data 控件和數(shù)據(jù)訪問(wèn)對(duì)象。我們已經(jīng)見(jiàn)識(shí)了DATA控件,確實(shí)給人意想不到的方便,但Data 控件只給出有限的訪問(wèn)現(xiàn)存數(shù)據(jù)庫(kù)的功能。而 DAO 模型則可以全面控制數(shù)據(jù)庫(kù)的完整編程接口。這兩種方法事實(shí)上并不是互斥的,實(shí)際上,它們常同時(shí)使用。
  DAO 模型是設(shè)計(jì)關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)結(jié)構(gòu)的對(duì)象類集合。它們提供了完成管理這樣一個(gè)系統(tǒng)所需的全部操作屬性和方法,包括創(chuàng)建數(shù)據(jù)庫(kù),定義表、字段和索引,建立表間的關(guān)系,定位和查詢數(shù)據(jù)庫(kù)等工具。DAO結(jié)構(gòu)的主要對(duì)象如圖10所示。
  Visual Basic 中的數(shù)據(jù)庫(kù)編程就是創(chuàng)建DAO(數(shù)據(jù)訪問(wèn)對(duì)象)。這些對(duì)象對(duì)應(yīng)于被訪問(wèn)物理數(shù)據(jù)庫(kù)的不同部分,如 Database、TableDef、Field 和 Index 對(duì)象,用這些對(duì)象的屬性和方法來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,能夠在 Visual Basic 窗體中使用綁定和非綁定控件來(lái)顯示操作結(jié)果并接收用戶輸入。這樣就簡(jiǎn)化了代碼,它賦予程序員很大的靈活性。因?yàn)榭梢允褂猛瑯拥膶?duì)象、屬性和方法來(lái)處理各種不同的數(shù)據(jù)庫(kù)格式。同時(shí),如果從一種數(shù)據(jù)庫(kù)格式變到另一種格式(例如,將本地的 Microsoft Access 數(shù)據(jù)庫(kù)轉(zhuǎn)換為網(wǎng)絡(luò)上的 SQL Server 數(shù)據(jù)庫(kù)),只需變動(dòng)少量的代碼就可以適應(yīng)這種改變。甚至可以創(chuàng)建這樣的應(yīng)用程序,在單一的查詢或報(bào)表中連接來(lái)自多個(gè)不同數(shù)據(jù)庫(kù)的表。
  我們先介紹DAO對(duì)象,從上圖中我們可以看到,DAO對(duì)象中最關(guān)鍵的是DBEngine對(duì)象,所有的數(shù)據(jù)庫(kù)操作都要通過(guò)它來(lái)完成。

DBEngine對(duì)象
DBEngine對(duì)象相當(dāng)于jet數(shù)據(jù)庫(kù)引擎,不需要?jiǎng)?chuàng)建該對(duì)象。
CreateWorkspace方法:創(chuàng)建一個(gè)工作區(qū)對(duì)象
例如 :
Dim ws As Workspace
Set ws = DbEngine.CreateWorkspace                 (SpName,UserID,password",SpType)
其中
SpName 工作區(qū)名稱String
UserID 用戶名 String
Password 口令String
SpType 工作區(qū)類型 = dbUsejet jet工作區(qū)
= dbUseODBCODBC工作區(qū)

Workspace對(duì)象
  Workspace對(duì)象為用戶定義一個(gè)會(huì)話,通過(guò)與之關(guān)聯(lián)的用戶名和口令建立一個(gè)安全級(jí)別。當(dāng)不需要安全級(jí)別時(shí)可使用缺省的工作區(qū)DBEngine.Workspace。
方法:
OpenDatebase    打開(kāi)一個(gè)數(shù)據(jù)庫(kù)
Close    關(guān)閉當(dāng)前工作區(qū)
BeginTrans    啟動(dòng)一個(gè)事務(wù)
CommitTrans    提交當(dāng)前事務(wù)
RollBack    回滾當(dāng)前事務(wù)
例如我們需要打開(kāi)一個(gè)數(shù)據(jù)庫(kù)。
我們調(diào)用Workspace的OpenDatabase方法打開(kāi)一個(gè)數(shù)據(jù)庫(kù)。
例如:
Dim db As DataBase
Set db=OpenDatabase(dbname,exc,readonly,source)
其中:
dbname    數(shù)據(jù)庫(kù)文件名(對(duì)于單表數(shù)據(jù)庫(kù)為路徑)
exc = TRUE 表示打開(kāi)數(shù)據(jù)庫(kù)后,該數(shù)據(jù)庫(kù)不能被其它應(yīng)用程序訪問(wèn)。
    FALSE 表示共享地打開(kāi)數(shù)據(jù)庫(kù)
Readonly=TRUE 表示打開(kāi)數(shù)據(jù)庫(kù)后,只能對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀操作
=FALSE 表示打開(kāi)數(shù)據(jù)庫(kù)后,可對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)操作
source數(shù)據(jù)源名,用于指定打開(kāi)地?cái)?shù)據(jù)庫(kù)類型。

創(chuàng)建記錄集
  我們使用DataBase對(duì)象的OpenRecordSet方法打開(kāi)一個(gè)記錄集。
例如:
Dim rs As RecordSet
Set rs=db.OpenRecordSet(source,type)
其中:
source 指定記錄集的內(nèi)容,它可以是一個(gè)表名,查詢名或SQL語(yǔ)句
type 創(chuàng)建記錄集的類型
=dbOpenTable表型記錄集
=dbOpenDynaset動(dòng)態(tài)型記錄集
=dbOpenSnapshot快照型記錄集

訪問(wèn)ODBC數(shù)據(jù)庫(kù)
  Visual Basic 通過(guò) DAO 和 Jet 引擎可以識(shí)別三類數(shù)據(jù)庫(kù):Visual Basic 數(shù)據(jù)庫(kù),外部數(shù)據(jù)庫(kù),ODBC 數(shù)據(jù)庫(kù)。在開(kāi)發(fā)大中型數(shù)據(jù)庫(kù)系統(tǒng)中一般都采用ODBC 數(shù)據(jù)庫(kù),如 Microsoft SQL Server等。DAO(數(shù)據(jù)訪問(wèn)對(duì)象)的 ODBCDirect 模式允許直接訪問(wèn) ODBC 數(shù)據(jù)。另外,遠(yuǎn)程數(shù)據(jù)對(duì)象 (RDO) 庫(kù)和遠(yuǎn)程數(shù)據(jù)控件 (RDC)也 允許直接訪問(wèn) ODBC 數(shù)據(jù)。
要訪問(wèn)ODBC數(shù)據(jù)庫(kù)需要兩步,首先需要在WINDOWS 95 或WINDOWS NT的控制面板中設(shè)置ODBC數(shù)據(jù)源名(DSN)。然后在OpenDatabase方法的Source參數(shù)中使用該數(shù)據(jù)源名。
例如:訪問(wèn)Microsoft SQL Server
Source="ODBC;DSN=MyDSN;UID=sa;PWD=xx;DataBase=pubs"
在程序中使用DAO
  DAO的強(qiáng)大功能確實(shí)讓人興奮,只是較之DATA控件要復(fù)雜得多。在復(fù)雜的數(shù)據(jù)庫(kù)處理中,這兩種方法常常同時(shí)使用。要使用DAO,必須選中VB的“工程”菜單下的“部件……”項(xiàng),在控件標(biāo)簽中選中"Microsoft DAO 3.5 Object Library"之后就可以在程序中定義DAO變量了。在這篇文章中我們所舉的數(shù)據(jù)庫(kù)例子比較簡(jiǎn)單,有興趣的朋友不妨采用數(shù)據(jù)訪問(wèn)對(duì)象(DAO)來(lái)實(shí)現(xiàn)這個(gè)程序。

七、高屋建瓴
  到了這里,似乎VB數(shù)據(jù)庫(kù)編程的內(nèi)容也差不多完整了,但是你完全可以再往前走一步。在目前的數(shù)據(jù)庫(kù)開(kāi)發(fā)過(guò)程中,客戶/服務(wù)器體系結(jié)構(gòu)占這個(gè)領(lǐng)域的主體地位,利用VB進(jìn)行客戶/服務(wù)器應(yīng)用程序的開(kāi)發(fā)是完全可行的。同時(shí),在程序開(kāi)發(fā)過(guò)程中,還可以利用面向?qū)ο蠹夹g(shù),提高你的程序的可重用性和可維護(hù)性。總之,數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā)始終是技術(shù)上和理論上的熱點(diǎn)。使用最高級(jí)的方法,最先進(jìn)的技術(shù),你會(huì)變得越來(lái)越COOL!