VB數(shù)據(jù)庫(kù)編程技術(shù)_第1頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù)_第2頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù)_第3頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù)_第4頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第9章 VB數(shù)據(jù)庫(kù)編程技術(shù)91數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ)911 VB中的數(shù)據(jù)訪問(wèn) VB提供的數(shù)據(jù)庫(kù)引擎叫Jet。VB提供了兩種與Jet數(shù)據(jù)庫(kù)引擎接口的方法:Data控件(Data Control)和數(shù)據(jù)訪問(wèn)對(duì)象(DAO)。Data控件只提供了有限的不需編程就能訪問(wèn)現(xiàn)存數(shù)據(jù)庫(kù)的功能,而DAO模型則是全面控制數(shù)據(jù)庫(kù)的完整編程接口。這兩種方法不是互斥的,實(shí)際上,它們可以同時(shí)使用。 VB中的數(shù)據(jù)庫(kù)編程就是創(chuàng)建數(shù)據(jù)訪問(wèn)對(duì)象,這些數(shù)據(jù)訪問(wèn)對(duì)象對(duì)應(yīng)于被訪問(wèn)的物理數(shù)據(jù)庫(kù)的不同部分,如Database(數(shù)據(jù)庫(kù))、Table(表)、Field(字段)和Index(索引)對(duì)象。用這些對(duì)象的屬性和方法來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。VB通

2、過(guò)DAO和Jet引擎可以識(shí)別三類(lèi)數(shù)據(jù)庫(kù):1. VB數(shù)據(jù)庫(kù):也稱(chēng)為本地?cái)?shù)據(jù)庫(kù),這類(lèi)數(shù)據(jù)庫(kù)文件使用與Microsoft Access相同的格式。Jet引擎直接創(chuàng)建和操作這些數(shù)據(jù)庫(kù)并且提供了最大程度的靈活性和速度。 2. 外部數(shù)據(jù)庫(kù):VB可以使用幾種比較流行的“索引順序訪問(wèn)文件方法(ISAM)”數(shù)據(jù)庫(kù),包括:dDase III、dBase IV、FoxPro 2.0和2.5以及Paradox 3.x和4.x。在VB中可以創(chuàng)建和操作所有這些格式的數(shù)據(jù)庫(kù),也可以訪問(wèn)文本文件數(shù)據(jù)庫(kù)和Excel或Lotus l-2-3電子表格文件。 3. ODBC數(shù)據(jù)庫(kù):包括符合ODBC標(biāo)準(zhǔn)的客戶(hù)機(jī)服務(wù)器數(shù)據(jù)庫(kù),如Micr

3、osoft SQL Server。如果要在VB中創(chuàng)建真正的客戶(hù)機(jī)服務(wù)器應(yīng)用程序,可以使用ODBC Direct直接把命令傳遞給服務(wù)器處理。912 VB數(shù)據(jù)庫(kù)體系結(jié)構(gòu)VB提供了基于Microsoft Jet數(shù)據(jù)庫(kù)引擎的數(shù)據(jù)訪問(wèn)能力,Jet引擎負(fù)責(zé)處理存儲(chǔ)、檢索、更新數(shù)據(jù)的結(jié)構(gòu),并提供了功能強(qiáng)大的面向?qū)ο蟮腄AO編程接口。1 VB數(shù)據(jù)庫(kù)應(yīng)用程序的組成VB數(shù)據(jù)庫(kù)應(yīng)用程序包含三部分,如圖9.1所示。Jet引擎用戶(hù)界面數(shù)據(jù)庫(kù)圖9.1 VB數(shù)據(jù)庫(kù)應(yīng)用程序的組成數(shù)據(jù)庫(kù)引擎位于程序和物理數(shù)據(jù)庫(kù)文件之間。這把用戶(hù)與正在訪問(wèn)的特定數(shù)據(jù)庫(kù)隔離開(kāi)來(lái),實(shí)現(xiàn)“透明”訪問(wèn)。不管這個(gè)數(shù)據(jù)庫(kù)是本地的VB數(shù)據(jù)庫(kù),還是所支持的其他

4、任何格式的數(shù)據(jù)庫(kù),所使用的數(shù)據(jù)訪問(wèn)對(duì)象和編程技術(shù)都是相同的。 (1)用戶(hù)界面和應(yīng)用程序代碼 用戶(hù)界面是用戶(hù)所看見(jiàn)的用于交互的界面,它包括顯示數(shù)據(jù)并允許用戶(hù)查看或更新數(shù)據(jù)的窗體。驅(qū)動(dòng)這些窗體的是應(yīng)用程序的VB代碼,包括用來(lái)請(qǐng)求數(shù)據(jù)庫(kù)服務(wù)的數(shù)據(jù)訪問(wèn)對(duì)象和方法,比如添加或刪除記錄,或執(zhí)行查詢(xún)等。 (2)Jet引擎 Jet引擎被包含在一組動(dòng)態(tài)鏈接庫(kù)(DLL)文件中。在運(yùn)行時(shí),這些文件被鏈接到VB程序。它把應(yīng)用程序的請(qǐng)求翻譯成對(duì).mdb(Access文件后綴)文件或其他數(shù)據(jù)庫(kù)的物理操作。它真正讀取、寫(xiě)入和修改數(shù)據(jù)庫(kù),并處理所有內(nèi)部事務(wù),如索引、鎖定、安全性和引用完整性。它還包含一個(gè)查詢(xún)處理器,接收并執(zhí)行

5、SQL查詢(xún),實(shí)現(xiàn)所需的數(shù)據(jù)操作。另外,它還包含一個(gè)結(jié)果處理器,用來(lái)管理查詢(xún)所返回的結(jié)果。 (3)數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)是包含數(shù)據(jù)庫(kù)表的一個(gè)或多個(gè)文件。對(duì)于本地VB或Access數(shù)據(jù)庫(kù)來(lái)說(shuō),就是mdb文件。對(duì)于ISAM數(shù)據(jù)庫(kù),它可能是包含.dbf(dBASE文件后綴)文件或其他擴(kuò)展名的文件?;蛘撸瑧?yīng)用程序可能會(huì)訪問(wèn)保存在幾個(gè)不同的數(shù)據(jù)庫(kù)文件或格式中的數(shù)據(jù)。但無(wú)論在什么情況下,數(shù)據(jù)庫(kù)本質(zhì)上都是被動(dòng)的,它包含數(shù)據(jù)但不對(duì)數(shù)據(jù)作任何操作。數(shù)據(jù)操作是數(shù)據(jù)庫(kù)引擎的任務(wù)。2數(shù)據(jù)庫(kù)應(yīng)用程序的存放 數(shù)據(jù)庫(kù)應(yīng)用程序的這三個(gè)部分可以被分別放置在不同的位置上??梢园阉鼈兌挤旁谝慌_(tái)計(jì)算機(jī)上,供單用戶(hù)應(yīng)用程序使用,也可以放置在通過(guò)

6、網(wǎng)絡(luò)連接起來(lái)的不同計(jì)算機(jī)上。例如,數(shù)據(jù)庫(kù)可以駐留在中央服務(wù)器上,而用戶(hù)界面(即應(yīng)用程序)則駐留在幾個(gè)客戶(hù)機(jī)上,讓許多用戶(hù)訪問(wèn)相同的數(shù)據(jù)。脫離開(kāi)應(yīng)用程序本身,將數(shù)據(jù)存放在另一臺(tái)機(jī)器上的數(shù)據(jù)庫(kù)應(yīng)用程序,有遠(yuǎn)程數(shù)據(jù)庫(kù)和客戶(hù)機(jī)/服務(wù)器數(shù)據(jù)庫(kù)兩種結(jié)構(gòu)。它們的不同點(diǎn)如圖9.2所示。 客戶(hù)機(jī)/服務(wù)器 遠(yuǎn)程數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)引擎數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)庫(kù)引擎數(shù)據(jù)庫(kù)用戶(hù)界面客戶(hù)機(jī)圖9.2 客戶(hù)機(jī)/服務(wù)器數(shù)據(jù)庫(kù)與遠(yuǎn)程數(shù)據(jù)庫(kù)的存放 在客戶(hù)機(jī)/服務(wù)器系統(tǒng)中,數(shù)據(jù)庫(kù)引擎和數(shù)據(jù)庫(kù)一起被放置在服務(wù)器上。數(shù)據(jù)庫(kù)引擎可以同時(shí)對(duì)多個(gè)客戶(hù)機(jī)的應(yīng)用程序提供服務(wù)、操作數(shù)據(jù)庫(kù)并對(duì)每個(gè)本地應(yīng)用程序返回所請(qǐng)求的記錄。在遠(yuǎn)程系統(tǒng)中,數(shù)據(jù)庫(kù)引擎與用戶(hù)應(yīng)用程序

7、在相同的計(jì)算機(jī)上,只有數(shù)據(jù)庫(kù)駐留在遠(yuǎn)程計(jì)算機(jī)上。Jet數(shù)據(jù)庫(kù)引擎不是客戶(hù)機(jī)服務(wù)器引擎,它是駐留在DLL文件中的本地?cái)?shù)據(jù)庫(kù)引擎,在運(yùn)行時(shí)被動(dòng)態(tài)地鏈接到VB應(yīng)用程序中。如果程序在不同的工作站上有許多備份,那么每個(gè)備份都將有它自己的Jet數(shù)據(jù)庫(kù)引擎在本地的備份。在VB中,通過(guò)連接到ODBC數(shù)據(jù)源,如Microsoft SQL Server等,可直接把查詢(xún)傳遞給服務(wù)器數(shù)據(jù)庫(kù)引擎,就可以創(chuàng)建客戶(hù)機(jī)/服務(wù)器應(yīng)用程序。92本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS) VB中創(chuàng)建數(shù)據(jù)庫(kù)的途徑主要有:(1)可視化數(shù)據(jù)管理器:使用可視化數(shù)據(jù)管理器,不需要編程就可以創(chuàng)建Jet數(shù)據(jù)庫(kù)。(2)DAO:使用VB的DAO部件可以通過(guò)編程

8、的方法創(chuàng)建數(shù)據(jù)庫(kù)。(3)Microsoft Access:因?yàn)镸icrosoft Access使用了與VB相同的數(shù)據(jù)庫(kù)引擎和格式,所以,用Microsoft Access創(chuàng)建的數(shù)據(jù)庫(kù)和直接在VB中創(chuàng)建的數(shù)據(jù)庫(kù)是一樣的。(4)數(shù)據(jù)庫(kù)應(yīng)用程序:像FoxPro、dBase或ODBC客戶(hù)機(jī)/服務(wù)器應(yīng)用程序這樣的產(chǎn)品,可以作為外部數(shù)據(jù)庫(kù),VB可通過(guò)ISAM或ODBC驅(qū)動(dòng)程序來(lái)訪問(wèn)這些數(shù)據(jù)庫(kù)。921可視化數(shù)據(jù)管理器 數(shù)據(jù)管理器(Data Manager)是VB的一個(gè)傳統(tǒng)成員,它可以用于快速地建立數(shù)據(jù)庫(kù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)內(nèi)容。VB的數(shù)據(jù)管理器實(shí)際上是一個(gè)獨(dú)立的可單獨(dú)運(yùn)行的應(yīng)用程序 Visdata.exe。它隨安裝

9、過(guò)程放置在VB目錄中,可以單獨(dú)運(yùn)行,也可以在VB開(kāi)發(fā)環(huán)境中啟動(dòng)。凡是VB有關(guān)數(shù)據(jù)庫(kù)的操作,比如數(shù)據(jù)庫(kù)結(jié)構(gòu)的建立、記錄的添加及修改以及用ODBC連接到服務(wù)器端的數(shù)據(jù)庫(kù)如SQL Server,都可以利用此工具來(lái)完成。 1啟動(dòng)數(shù)據(jù)管理器選擇“外接程序”菜單下的“可視化數(shù)據(jù)管理器”項(xiàng)就可以啟動(dòng)數(shù)據(jù)管理器,打開(kāi)“VisData”窗口。 2工具欄按鈕 VisData 窗口的工具欄提供了三組共9個(gè)按鈕,為了說(shuō)明這些按鈕所提供的功能,我們利用VB提供的一個(gè)例子數(shù)據(jù)庫(kù)Biblio.mdb來(lái)介紹。Biblio.mdb存放在VB98目錄中,單擊“文件”菜單中的“打開(kāi)數(shù)據(jù)庫(kù)”級(jí)聯(lián)菜單的“Microsoft Acces

10、s”項(xiàng),即可在出現(xiàn)的對(duì)話框中看到Biblio.mdb,選中并打開(kāi)它,打開(kāi)后的VisData窗口如圖9.3所示。我們可以看到,在這個(gè)MDI窗口內(nèi)包含兩個(gè)子窗口:數(shù)據(jù)庫(kù)窗口和SQL語(yǔ)句窗口。數(shù)據(jù)庫(kù)窗口顯示了數(shù)據(jù)庫(kù)的結(jié)構(gòu),包括表名、列名、索引。SQL語(yǔ)句窗口可用于輸入一些SQL命令,針對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行查詢(xún)操作。圖9.3 VisData窗口下面我們對(duì)工具欄上的按鈕進(jìn)行簡(jiǎn)單的說(shuō)明。(1)類(lèi)型群組按鈕工具欄的第一組按鈕,它可以設(shè)置記錄集的訪問(wèn)方式,具體為: 表類(lèi)型記錄集按鈕(最左邊的按鈕):當(dāng)以這種方式打開(kāi)數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),所進(jìn)行的增、刪、改、查等操作都是直接更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 動(dòng)態(tài)集類(lèi)型記錄集按鈕(

11、中間的按鈕):使用這種方式是先將指定的數(shù)據(jù)打開(kāi)并讀入到內(nèi)存中,當(dāng)用戶(hù)進(jìn)行數(shù)據(jù)編輯操作時(shí),不直接影響數(shù)據(jù)庫(kù)中的數(shù)據(jù)。使用這種方式可以加快運(yùn)行速度??煺疹?lèi)型記錄集(最右邊的拉鈕):以這種類(lèi)型顯示的數(shù)據(jù)只能讀不能修改,適用于只查詢(xún)的情況。(2)數(shù)據(jù)群組按鈕工具欄的中間一組按鈕。用于指定數(shù)據(jù)表中數(shù)據(jù)的顯示方式。先用鼠標(biāo)在要顯示風(fēng)格的按鈕上單擊一下,然后選中某個(gè)要顯示數(shù)據(jù)的數(shù)據(jù)表,單擊鼠標(biāo)右鍵,在彈出的菜單上選擇“打開(kāi)”,則此表中的數(shù)據(jù)就以所要求的形式顯示出來(lái)。(3)事務(wù)方式群組按鈕工具欄的最后一組按鈕用于進(jìn)行事務(wù)處理。922具體實(shí)現(xiàn) 1建立數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)管理器的基本功能有了初步的認(rèn)識(shí)后,我們看一下如何利

12、用它來(lái)建立數(shù)據(jù)庫(kù)。我們這里所建立的數(shù)據(jù)庫(kù)student.mdb(學(xué)生數(shù)據(jù)庫(kù))中各表如下:基本情況(學(xué)號(hào),姓名,性別,專(zhuān)業(yè),出生年月,照片,備注)學(xué)生成績(jī)表(學(xué)號(hào),課程,成績(jī),學(xué)期) (1)建立數(shù)據(jù)庫(kù)結(jié)構(gòu) 單擊“文件”菜單中的“新建”命令,在“新建”級(jí)聯(lián)菜單中選擇“Microsoft Access”,再選擇“版本7.0 MDB”項(xiàng),在“選擇要?jiǎng)?chuàng)建的Microsoft Access數(shù)據(jù)庫(kù)”窗口中選定新建數(shù)據(jù)庫(kù)的路徑并輸入數(shù)據(jù)庫(kù)名,這里為student.mdb。 這樣一個(gè)新的數(shù)據(jù)庫(kù)就建立好了,下面就要在此數(shù)據(jù)庫(kù)中添加數(shù)據(jù)表了。 (2)添加數(shù)據(jù)表將鼠標(biāo)移到數(shù)據(jù)庫(kù)窗口區(qū)域內(nèi),單擊鼠標(biāo)右鍵,在彈出的菜單中

13、選擇“新建表”命令,出現(xiàn)“表結(jié)構(gòu)”對(duì)話框,利用對(duì)話框我們可以建立數(shù)據(jù)表的結(jié)構(gòu)。我們首先建立基本情況表。在“表名稱(chēng)”中輸入“基本情況”,然后添加基本情況表的字段,單擊“添加字段”按鈕,出現(xiàn)“添加字段”對(duì)話框,在此對(duì)話框中填入“學(xué)號(hào)”字段的信息。 按順序輸入“姓名”、“性別”、“專(zhuān)業(yè)”、“出生年月”、“照片”、“備注”字段,然后按“關(guān)閉”按鈕返回到“表結(jié)構(gòu)”對(duì)話框中。(3)建立索引建立了表的結(jié)構(gòu)后就可以建立此表的索引了,這樣可以加快檢索速度。單擊“添加索引”按鈕,會(huì)出現(xiàn)如圖9.4所示的對(duì)話框,通過(guò)此對(duì)話框可以將數(shù)據(jù)表的某些字段設(shè)置為索引。在“名稱(chēng)”字段中輸入索引的名稱(chēng),然后從下邊的“索引的字段”列

14、表中選擇作為索引的字段,我們這里選擇的是“學(xué)號(hào)”。 圖9.4 設(shè)置索引對(duì)話框 如果需要建立多個(gè)索引,則每完成一項(xiàng)索引后,單擊“確定”按鈕,然后繼續(xù)下一個(gè)索引的設(shè)置。設(shè)置完畢后,單擊“關(guān)閉”按鈕返回到“表結(jié)構(gòu)”對(duì)話框。2錄入數(shù)據(jù) 數(shù)據(jù)表結(jié)構(gòu)建立好之后,就可以向表中輸入數(shù)據(jù)了,數(shù)據(jù)管理器提供了簡(jiǎn)單的數(shù)據(jù)錄入功能。首先在工具欄上選定DBGrid顯示風(fēng)格的按鈕,然后在要錄入數(shù)據(jù)的數(shù)據(jù)表上單擊鼠標(biāo)右鍵,選擇“打開(kāi)”選項(xiàng),則出現(xiàn)以網(wǎng)格風(fēng)格顯示數(shù)據(jù)的窗口,如果此表中已有數(shù)據(jù),則此時(shí)會(huì)顯示出此表中的全部數(shù)據(jù);若此表中無(wú)數(shù)據(jù),則會(huì)顯示出一個(gè)空表。如圖9.5所示。我們這里是以“基本情況”表為例,并且輸入了部分?jǐn)?shù)據(jù)

15、后的情況。 圖9.5 錄入數(shù)據(jù)3建立查詢(xún)數(shù)據(jù)表建立好之后,如果數(shù)據(jù)表中已經(jīng)有數(shù)據(jù),就可以對(duì)表中的數(shù)據(jù)進(jìn)行有條件或無(wú)條件的查詢(xún)。VB的數(shù)據(jù)管理器提供了一個(gè)圖形化的設(shè)置查詢(xún)條件的窗口查詢(xún)生成器。選擇“實(shí)用程序”菜單下的“查詢(xún)生成器”,或在數(shù)據(jù)庫(kù)窗口區(qū)域單擊鼠標(biāo)右健,然后在彈出的菜單中選擇“新查詢(xún)”,即可出現(xiàn)“查詢(xún)生成器”對(duì)話框,如圖9.6所示。假設(shè)我們要查詢(xún)學(xué)號(hào)為110002的學(xué)生基本情況,可按下述步驟進(jìn)行:(1)首先選擇要進(jìn)行查詢(xún)的數(shù)據(jù)表,單擊表列表框中的“基本情況”表。(2)在“字段名稱(chēng)”字段中選定“基本情況.學(xué)號(hào)”。(3)單擊“運(yùn)算符”列表,選擇“=”。(4)單擊“列出可能的值”按鈕,在“值

16、”字段中輸入110002。(5)單擊“將And加入條件”按鈕,將條件加入“條件”列表框中。(6)在“要顯示的字段”列表框中,選定所需顯示的字段。注意,這里所選的字段就是我們?cè)诓樵?xún)結(jié)果中要看的字段。(7)單擊“運(yùn)行”按鈕,在隨后出現(xiàn)的VisData對(duì)話框中,選擇“否”,并進(jìn)一步選擇“運(yùn)行”,即可看到查詢(xún)結(jié)果。(8)單擊“顯示“按鈕,在隨后出現(xiàn)的“SQL Query”窗口中,顯示剛建立的查詢(xún)所對(duì)應(yīng)的SQL語(yǔ)句。圖9.6 “查詢(xún)生成器”對(duì)話框93 數(shù)據(jù)控件 Data控件是Visual Basic訪問(wèn)數(shù)據(jù)庫(kù)的一種利器,它能夠利用三種Recordset對(duì)象來(lái)訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),數(shù)據(jù)控件提供有限的不需編程

17、而能訪問(wèn)現(xiàn)存數(shù)據(jù)庫(kù)的功能,允許將Visual Basic的窗體與數(shù)據(jù)庫(kù)方便地進(jìn)行連接。要利用數(shù)據(jù)控件返回?cái)?shù)據(jù)庫(kù)中記錄的集合,應(yīng)先在窗體上畫(huà)出控件,再通過(guò)它的三個(gè)基本屬性Connect、DatabaseName和RecordSource設(shè)置要訪問(wèn)的數(shù)據(jù)資源。931 數(shù)據(jù)控件屬性 1Connect屬性 Connect屬性指定數(shù)據(jù)控件所要連接的數(shù)據(jù)庫(kù)類(lèi)型,Visual Basic默認(rèn)的數(shù)據(jù)庫(kù)是Access的MDB文件,此外,也可連接DBF、XLS、ODBC等類(lèi)型的數(shù)據(jù)庫(kù)。 2DatabaseName屬性 DatabaseName屬性指定具體使用的數(shù)據(jù)庫(kù)文件名,包括所有的路徑名。如果連接的是單表數(shù)據(jù)庫(kù)

18、,則DatabaseName屬性應(yīng)設(shè)置為數(shù)據(jù)庫(kù)文件所在的子目錄名,而具體文件名放在RecordSource屬性中。 例如,要連接一個(gè)Microsoft Access的數(shù)據(jù)庫(kù)C:Student.mdb,則設(shè)置DatabaseName=”C:Student.mdb",Access數(shù)據(jù)庫(kù)的所有表都包含在一個(gè)MDB文件中。如果連接一個(gè)FoxPro數(shù)據(jù)庫(kù)如C:VB6stu_fox.dbf,則DatabaseName=”C:VB6”,RecordSource=”stu_fox.dbf”,stu_fox數(shù)據(jù)庫(kù)只含有一個(gè)表。 3RecordSource屬性RecordSource確定具體可訪問(wèn)的數(shù)據(jù)

19、,這些數(shù)據(jù)構(gòu)成記錄集對(duì)象Recordset。該屬性值可以是數(shù)據(jù)庫(kù)中的單個(gè)表名,個(gè)存儲(chǔ)查詢(xún),也可以是使用SQL查詢(xún)語(yǔ)言的一個(gè)查詢(xún)字符串。 例如,要指定Student.mdb數(shù)據(jù)庫(kù)中的基本情況表,則RecordSource=”基本情況”。而RecordSource=”Select * From 基本情況Where專(zhuān)業(yè)=物理 ”,則表示要訪問(wèn)基本情況表中所有物理系學(xué)生的數(shù)據(jù)。 4RecordType屬性 RecordType屬性確定記錄集類(lèi)型。 5EofAction和BofAction屬性當(dāng)記錄指針指向Recordset對(duì)象的開(kāi)始(第一個(gè)記錄前)或結(jié)束(最后一個(gè)記錄后)時(shí),數(shù)據(jù)控件的EofActio

20、n和BofAction屬性的設(shè)置或返回值決定了數(shù)據(jù)控件要采取的操作。屬性的取值如表9.1所示。表9.1 EofAction和BofAction屬性屬性取值操作BofAction0控件重定位到第個(gè)記錄1移過(guò)記錄集開(kāi)始位,定位到一個(gè)無(wú)效記錄,觸發(fā)數(shù)據(jù)控件對(duì)第一個(gè)記錄的無(wú)效事件ValidateEofAction0控件重定位到最后個(gè)記錄1移過(guò)記錄集結(jié)束位,定位到一個(gè)無(wú)效記錄,觸發(fā)數(shù)據(jù) 控件對(duì)最后一個(gè)記錄的無(wú)效事件Validate 2向記錄集加入新的空記錄,可以對(duì)新記錄進(jìn)行編輯,移動(dòng)記錄指針,新記錄寫(xiě)入數(shù)據(jù)庫(kù)在Visual Basic中,數(shù)據(jù)控件本身不能直接顯示記錄集中的數(shù)據(jù),必須通過(guò)能與它綁定的控件來(lái)

21、實(shí)現(xiàn)。可與數(shù)據(jù)控件綁定的控件對(duì)象有文本框、標(biāo)簽、圖像框、圖形框、列表框、組合框、復(fù)選框、網(wǎng)格、DB列表框、DB組合框、DB網(wǎng)格和OLE容器等控件。要使綁定控件能被數(shù)據(jù)庫(kù)約束,必需在設(shè)計(jì)或運(yùn)行時(shí)對(duì)這些控件的兩個(gè)屬性進(jìn)行設(shè)置:(1)DataSource屬性DataSource屬性通過(guò)指定個(gè)有效的數(shù)據(jù)控件連接到一個(gè)數(shù)據(jù)庫(kù)上。(2)DataField屬性DataField屬性設(shè)置數(shù)據(jù)庫(kù)有效的字段與綁定控件建立聯(lián)系。綁定控件、數(shù)據(jù)控件和數(shù)據(jù)庫(kù)三者的關(guān)系如圖9.7所示。綁定控件數(shù)據(jù)庫(kù)數(shù)據(jù)控件圖9.7 綁定控件、數(shù)據(jù)控件和數(shù)據(jù)庫(kù)三者的關(guān)系 當(dāng)上述控件與數(shù)據(jù)控件綁定后,Visual Basic將當(dāng)前記錄的字段

22、值賦給控件。如果修改了綁定控件內(nèi)的數(shù)據(jù),只要移動(dòng)記錄指針,修改后的數(shù)據(jù)會(huì)自動(dòng)寫(xiě)入數(shù)據(jù)庫(kù)。數(shù)據(jù)控件在裝入數(shù)據(jù)庫(kù)時(shí),它把記錄集的第一個(gè)記錄作為當(dāng)前記錄。當(dāng)數(shù)據(jù)控件的BofAction屬性值設(shè)置為2時(shí),當(dāng)記錄指針移過(guò)記錄集結(jié)束位,數(shù)據(jù)控件會(huì)自動(dòng)向記錄集加入新的空記錄。例9.1 建立student.mdb數(shù)據(jù)庫(kù),它包含兩個(gè)表:“基本情況”表和“學(xué)生成績(jī)表”。參見(jiàn)表9.2和表9.3。表9.2 學(xué)生基本情況表結(jié)構(gòu)字段名類(lèi)型寬度學(xué)號(hào)Text6姓名Text10性別Text2專(zhuān)業(yè)Text10出生年月Date8照片Binary0表9.3 學(xué)生成績(jī)表結(jié)構(gòu)字段名類(lèi)型寬度學(xué)號(hào)Text6課程Text10成績(jī)Long4學(xué)期

23、Text2用可視化數(shù)據(jù)管理器建立以上設(shè)計(jì)的數(shù)據(jù)庫(kù)及其表,表中數(shù)據(jù)可自行錄入。例9.2 設(shè)計(jì)一個(gè)窗體用以顯示建立的student.mdb數(shù)據(jù)庫(kù)中基本情況表的內(nèi)容。基本情況表包含了6個(gè)字段,故需要用6個(gè)綁定控件與之對(duì)應(yīng)。這里用一個(gè)圖形框顯示照片和5個(gè)文本框顯示學(xué)號(hào)、姓名等數(shù)據(jù)。本例中不需要編寫(xiě)任何代碼,具體操作步驟如下: (1)參考如圖9.8所示窗體,在窗體上放置1個(gè)數(shù)據(jù)控件,一個(gè)圖形框、5個(gè)文本框和5個(gè)標(biāo)簽控件。5個(gè)標(biāo)簽控件分別給出相關(guān)的提示說(shuō)明。圖9.8 顯示Student.mdb基本情況表的數(shù)據(jù)(2)將數(shù)據(jù)控件Data1的Connect屬性指定為Access類(lèi)型,DatabaseName屬性

24、連接數(shù)據(jù)庫(kù)Student.mdb,RecordSource屬性設(shè)置為“基本情況”表。(3)圖形框和5個(gè)文本框控件Text1Text5的DataSource屬性都設(shè)置成Data1。通過(guò)單擊這些綁定控件的DataField屬性上的“”按鈕,將下拉出基本情況表所含的全部字段,分別選擇與其對(duì)應(yīng)的字段照片、學(xué)號(hào)、姓名、性別、專(zhuān)業(yè)和出生年月,使之建立約束關(guān)系。 運(yùn)行該工程即可出現(xiàn)圖9.8所示效果。5個(gè)文本框分別顯示基本情況表內(nèi)的字段:學(xué)號(hào)、姓名、性別、專(zhuān)業(yè)和出生年月的內(nèi)容,圖形框顯示每個(gè)學(xué)生的照片。 使用數(shù)據(jù)控件對(duì)象的4個(gè)箭頭按鈕可遍歷整個(gè)記錄集中的記錄。單擊最左邊的按鈕顯示第l條記錄;單擊其旁邊的按鈕顯

25、示上一條記錄;單擊最右邊的按鈕顯示最后一條記錄;單擊其旁邊的按鈕顯示下條記錄。數(shù)據(jù)控件除了可以瀏覽Recordset對(duì)象中的記錄外,同時(shí)還可以編輯數(shù)據(jù)。如果改變了某個(gè)字段的值,只要移動(dòng)記錄,這時(shí)所作的改變存入數(shù)據(jù)庫(kù)中。 Visual Basic 6.0提供了幾個(gè)比較復(fù)雜的網(wǎng)格控件,幾乎不用編寫(xiě)代碼就可以實(shí)現(xiàn)多條記錄數(shù)據(jù)顯示。當(dāng)把數(shù)據(jù)網(wǎng)格控件的DataSource屬性設(shè)置為一個(gè)Data控件時(shí),網(wǎng)格控件會(huì)被自動(dòng)地填充,并且其列標(biāo)題會(huì)用Data控件的記錄集里的數(shù)據(jù)自動(dòng)地設(shè)置。例9.3 用數(shù)據(jù)網(wǎng)格控件MsFlexGrid顯示Student.mdb數(shù)據(jù)庫(kù)中基本情況表的內(nèi)容。MsFlexGrid控件不是V

26、isual Basic工具箱內(nèi)的默認(rèn)控件,需要在開(kāi)發(fā)環(huán)境中選擇“工程|部件”菜單命令,并在隨即出現(xiàn)的對(duì)話框中選擇“MicroSoft FlexGrid Control 6.0”選項(xiàng),將其添加到工具箱中。本例所用控件的屬性設(shè)置如表9.4所示。請(qǐng)讀者自行比較不可卷動(dòng)列屬性FixedCols=0與FixedCols=1的區(qū)別。Form啟動(dòng)后自動(dòng)顯示如圖9.9所示窗口。 表9.4 控件屬性默認(rèn)控件名其它屬性設(shè)置Data1DatabaseName=”c:student.mdb”RecordsetType=0RecordSource=”基本情況”MSFlexGrid1DataSource=Data1Fix

27、Cols=0圖9.9使用數(shù)據(jù)網(wǎng)格控件932數(shù)據(jù)控件的事件 1Reposition事件 Reposition事件發(fā)生在一條記錄成為當(dāng)前記錄后,只要改變記錄集的指針使其從一條記錄移到另一條記錄,會(huì)產(chǎn)生Reposition事件。通常,可以在這個(gè)事件中顯示當(dāng)前指針的位置。例如,在例9.2的Data1_Reposition事件中加入如下代碼:Private Sub Data1_Reposition() Data1.Caption = Data1.Recordset.AbsolutePosition + 1End Sub 這里,Recordset為記錄集對(duì)象,AbsolutePosition屬性指示當(dāng)前指

28、針值(從0開(kāi)始)。當(dāng)單擊數(shù)據(jù)控件對(duì)象上的箭頭按鈕時(shí),數(shù)據(jù)控件的標(biāo)題區(qū)會(huì)顯示記錄的序號(hào)。 2.Validate事件當(dāng)要移動(dòng)記錄指針、修改與刪除記錄前或卸載含有數(shù)據(jù)控件的窗體時(shí)都觸發(fā)Validate事件。Validate事件檢查被數(shù)據(jù)控件綁定的控件內(nèi)的數(shù)據(jù)是否發(fā)生變化。它通過(guò)Save參數(shù)(True或False)判斷是否有數(shù)據(jù)發(fā)生變化,Action參數(shù)判斷哪種操作觸發(fā)了Validate事件。參數(shù)可為表9.5中的值。表9.5 Validate事件的Action參數(shù)Action值描述Action值描述0取消對(duì)數(shù)據(jù)控件的操作6Update1MoveFirst7Delete2MovePrevious8Fin

29、d3MoveNext9設(shè)置Bookmark4MoveLast10Close5AddNew11卸載窗體 一般可用Validate事件來(lái)檢查數(shù)據(jù)的有效性。例如,在例9.2中,如果不允許用戶(hù)在數(shù)據(jù)瀏覽時(shí)清空性別數(shù)據(jù),可使用下列代碼:Private Sub Data1_Validate(Action As Integer, Save As Integer) If Save And Len(Trim(Text3) = 0 Then Action = 0 MsgBox " 性別不能為空!"End IfEnd Sub 此代碼檢查被數(shù)據(jù)控件綁定的控件Text3內(nèi)的數(shù)據(jù)是否被清空。如果Tex

30、t3內(nèi)的數(shù)據(jù)發(fā)生變化,則Save參數(shù)返回True,若性別對(duì)應(yīng)的文本框Text3被置空,則通過(guò)Action=0取消對(duì)數(shù)據(jù)控件的操作。933 數(shù)據(jù)控件的常用方法 數(shù)據(jù)控件的內(nèi)置功能很多,可以在代碼中用數(shù)據(jù)控件的方法訪問(wèn)這些屬性。1Refresh方法如果在設(shè)計(jì)狀態(tài)沒(méi)有為打開(kāi)數(shù)據(jù)庫(kù)控件的有關(guān)屬性全部賦值,或當(dāng)RecordSource在運(yùn)行時(shí)被改變后,必須使用數(shù)據(jù)控件的Refresh方法激活這些變化。在多用戶(hù)環(huán)境下,當(dāng)其他用戶(hù)同時(shí)訪問(wèn)同一數(shù)據(jù)庫(kù)和表時(shí),Refresh方法將使各用戶(hù)對(duì)數(shù)據(jù)庫(kù)的操作有效。例如:將例9.2的設(shè)計(jì)參數(shù)改用代碼實(shí)現(xiàn),使所連接數(shù)據(jù)庫(kù)所在的文件夾可隨程序而變化:Private Sub

31、Form_Load( ) Dim mpath As String Mpath=App.Path 獲取當(dāng)前路徑 If Right(mpath,1)<>”/” Then mpath=mpath+”/” Data1.DatabaseName=mpath+”Student.mdb” 連接數(shù)據(jù)庫(kù) Data1.RecordSource=”基本情況” 構(gòu)成記錄集對(duì)象 Data1.Refresh 激活數(shù)據(jù)控件End Sub2UpdateControls方法UpdateControls方法可以將數(shù)據(jù)從數(shù)據(jù)庫(kù)中重新讀到被數(shù)據(jù)控件綁定的控件內(nèi)。因而我們可使用UpdateControls方法終止用戶(hù)對(duì)綁定

32、控件內(nèi)數(shù)據(jù)的修改。 例如:將代碼Data1.UpdateControts放在一個(gè)命令按鈕的Click事件中,就可以實(shí)現(xiàn)對(duì)記錄修改的功能。 3. UpdateRecord方法當(dāng)對(duì)綁定控件內(nèi)的數(shù)據(jù)修改后,數(shù)據(jù)控件需要移動(dòng)記錄集的指針才能保存修改。如果使用UpdateRecord方法,可強(qiáng)制數(shù)據(jù)控件將綁定控件內(nèi)的數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)中,而不再觸發(fā)Validate事件。在代碼中可以用該方法來(lái)確認(rèn)修改。934 記錄集的屬性與方法 由RecordSource確定的具體可訪問(wèn)的數(shù)據(jù)構(gòu)成的記錄集Recordset也是一個(gè)對(duì)象,因而,它和其他對(duì)象一樣具有屬性和方法。下面列出記錄集常用的屬性和方法。1Absolute

33、Position屬性AbsolutePosition返回當(dāng)前指針值,如果是第1條記錄,其值為0,該屬性為只讀屬性。2Bof和Eof的屬性 Bof判定記錄指針是否在首記錄之前,若Bof為T(mén)rue,則當(dāng)前位置位于記錄集的第1條記錄之前。與此類(lèi)似,Eof判定記錄指針是否在末記錄之后。3Bookmark屬性 Bookmark屬性的值采用字符串類(lèi)型,用于設(shè)置或返回當(dāng)前指針的標(biāo)簽。在程序中可以使用Bookmark屬性重定位記錄集的指針,但不能使用AbsolutePostion屬性。4Nomatch屬性 在記錄集中進(jìn)行查找時(shí),如果找到相匹配的記錄,則Recordset的NoMatch屬性為False,否則為

34、True。該屬性常與Bookmark屬性一起使用。5RecordCount屬性 RecordCount屬性對(duì)Recordset對(duì)象中的記錄計(jì)數(shù),該屬性為只讀屬性。在多用戶(hù)環(huán)境下,RecordCount屬性值可能不準(zhǔn)確,為了獲得準(zhǔn)確值,在讀取RecordCount屬性值之前,可使用MoveLast方法將記錄指針移至最后一條記錄上。6Move方法 使用Move方法可代替對(duì)數(shù)據(jù)控件對(duì)象的4個(gè)箭頭按鈕的操作遍歷整個(gè)記錄集。5種Move方法是: (1)MoveFirst方法:移至第1條記錄。 (2)MoveLast方法:移至最后一條記錄。 (3)MoveNext方法:移至下一條記錄。(4)MovePre

35、vious方法:移至上一條記錄。(5)Move n 方法:向前或向后移n條記錄,n為指定的數(shù)值。例9.4 在窗體上用4個(gè)命令按鈕代替例9.2數(shù)據(jù)控件對(duì)象的4個(gè)箭頭按鈕的操作。在例9.2的基礎(chǔ)上,窗體上增加4個(gè)命令按鈕,將數(shù)據(jù)控件的Visible屬性設(shè)置為False,如圖9.10所示。通過(guò)對(duì)4個(gè)命令按鈕的編程代替對(duì)數(shù)據(jù)控件對(duì)象的4個(gè)箭頭按鈕的操作。圖9.10 用按鈕代替數(shù)據(jù)控件對(duì)象的箭頭按鈕命令按鈕Command1_Click事件移至第1條記錄,代碼如下:Private Sub Command1_Click()End Sub命令按鈕Command4_Click事件移至最后一條記錄,代碼如下:Pr

36、ivate Sub Command4_Click()End Sub 另外兩個(gè)按鈕的代碼需要考慮Recordset對(duì)象的邊界的首尾,如果越界,則用MoveFirst方法定位到第1條記錄或用MoveLast方法定位到最后一條記錄。程序代碼如下:Private Sub Command2_Click()End SubPrivate Sub Command3_Click()End Sub7Find方法使用Find方法可在指定的Dynaset或Snapshot類(lèi)型的Recordset對(duì)象中查找與指定條件相符的一條記錄,并使之成為當(dāng)前記錄。4種Find方法是: (1)FindFirst方法:從記錄集的開(kāi)始查

37、找滿足條件的第1條記錄。 (2)FindLast方法:從記錄集的尾部向前查找滿足條件的第l條記錄。 (3)FindNext方法:從當(dāng)前記錄開(kāi)始查找滿足條件的下一條記錄。 (4)FindPrevious方法:從當(dāng)前記錄開(kāi)始查找滿足條件的上一條記錄。4種Find方法的語(yǔ)法格式相同:數(shù)據(jù)集合.Find方法 條件 搜索條件是一個(gè)指定字段與常量關(guān)系的字符串表達(dá)式。在構(gòu)造表達(dá)式時(shí),除了用普通的關(guān)系運(yùn)算外,還可以用Like運(yùn)算符。 例如:語(yǔ)句 “Data1.Recordset.FindFirst 專(zhuān)業(yè)=物理”表示在由Data1數(shù)據(jù)控件所連接的數(shù)據(jù)庫(kù)Student.mdb的記錄集內(nèi)查找專(zhuān)業(yè)為“物理”的第l條記

38、錄。這里,“專(zhuān)業(yè)”為數(shù)據(jù)庫(kù)Student記錄集中的字段名,在該字段中存放專(zhuān)業(yè)名稱(chēng)信息。要想查找下一條符合條件的記錄,可繼續(xù)使用語(yǔ)句:”Data1.Recordset.FindNext 專(zhuān)業(yè)=物理”。 又例如:要在記錄集內(nèi)查找專(zhuān)業(yè)名稱(chēng)中帶有“建”字的專(zhuān)業(yè): Data1.Recordset.FindFirst 專(zhuān)業(yè) Like ”*建*”字符串“*建*”匹配字段專(zhuān)業(yè)中帶有“建”字字樣的所有專(zhuān)業(yè)名稱(chēng)字符串。 需要指出的是Find方法在找不到相匹配的記錄時(shí),當(dāng)前記錄保持在查找的始發(fā)處,NoMatch屬性為T(mén)rue。如果Find方法找到相匹配的記錄,則記錄定位到該記錄,Recordset的NoMatch屬

39、性為False。8Seek方法 使用Seek方法必須打開(kāi)表的索引,它在Table表中查找與指定索引規(guī)則相符的第1條記錄,并使之成為當(dāng)前記錄。其語(yǔ)法格式為: 數(shù)據(jù)表對(duì)象.seek comparison,keyl,key2 Seek允許接受多個(gè)參數(shù),第1個(gè)是比較運(yùn)算符comparison,Seek方法中可用的比較運(yùn)算符有=、>=、>、<>、<、<=等。 在使用Seek方法定位記錄時(shí),必須通過(guò)Index屬性設(shè)置索引。若在記錄集中多次使用同樣的Seek方法(參數(shù)相同),那么找到的總是同一條記錄。 例如:假設(shè)數(shù)據(jù)庫(kù)Student內(nèi)基本情況表的索引字段為學(xué)號(hào),滿足學(xué)號(hào)字

40、段值大于等于110001的第1條記錄可使用以下程序代碼:Data1.RecordsetType = 0 設(shè)置記錄集類(lèi)型為T(mén)ableData1.RecordSource = "基本情況" 打開(kāi)基本情況表單Data1.RefreshData1.Recordset.Index = "jbqk_no" 打開(kāi)名稱(chēng)為jbqk_no的索引Data1.Recordset.Seek ">=", "110001"935 數(shù)據(jù)庫(kù)記錄的增、刪、改操作 Data控件是瀏覽表格并編輯表格的好工具,但怎么輸入新信息或刪除現(xiàn)有記錄呢?這需要

41、編寫(xiě)幾行代碼,否則無(wú)法在Data控件上完成數(shù)據(jù)輸入。數(shù)據(jù)庫(kù)記錄的增、刪、改操作需要使用AddNew、Delete、Edit、Update和Refresh方法。它們的語(yǔ)法格式為: 數(shù)據(jù)控件.記錄集.方法名1增加記錄AddNew方法在記錄集中增加新記錄。增加記錄的步驟為:(1)調(diào)用AddNew方法。 (2)給各字段賦值。給字段賦值格式為:Recordset.Fields(”字段名”)=值。 (3)調(diào)用Update方法,確定所做的添加,將緩沖區(qū)內(nèi)的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)。 注意:如果使用AddNew方法添加新的記錄,但是沒(méi)有使用Update方法而移動(dòng)到其他記錄,或者關(guān)閉記錄集,那么所做的輸入將全部丟失,而且

42、沒(méi)有任何警告。當(dāng)調(diào)用Update方法寫(xiě)入記錄后,記錄指針自動(dòng)返回到添加新記錄前的位置上,而不顯示新記錄。為此,可在調(diào)用Update方法后,使用MoveLast方法將記錄指針再次移到新記錄上。2刪除記錄要從記錄集中刪除記錄的操作分為三步:(1)定位被刪除的記錄使之成為當(dāng)前記錄。(2)調(diào)用Delete方法。(3)移動(dòng)記錄指針。 注意:在使用Delete方法時(shí),當(dāng)前記錄立即刪除,不加任何的警告或者提示。刪除一條記錄后,被數(shù)據(jù)庫(kù)所約束的綁定控件仍舊顯示該記錄的內(nèi)容。因此,你必須移動(dòng)記錄指針?biāo)⑿陆壎丶悴捎靡浦料乱挥涗浀奶幚矸椒?。在移?dòng)記錄指針后,應(yīng)該檢查Eof屬性。3編輯記錄 數(shù)據(jù)控件自動(dòng)提供了修

43、改現(xiàn)有記錄的能力,當(dāng)直接改變被數(shù)據(jù)庫(kù)所約束的綁定控件的內(nèi)容后,需單擊數(shù)據(jù)控件對(duì)象的任一箭頭按鈕來(lái)改變當(dāng)前記錄,確定所做的修改。也可通過(guò)程序代碼來(lái)修改記錄,使用程序代碼修改當(dāng)前記錄的步驟為: (1)調(diào)用Edit方法。 (2)給各字段賦值。 (3)調(diào)用Update方法,確定所做的修改。 注意:如果要放棄對(duì)數(shù)據(jù)的所有修改,可用Refresh方法,重讀數(shù)據(jù)庫(kù),沒(méi)有調(diào)用Update方法,數(shù)據(jù)的修改沒(méi)有寫(xiě)入數(shù)據(jù)庫(kù),所以這樣的記錄會(huì)在刷新記錄集時(shí)丟失。例9.5 在例9.2的基礎(chǔ)上加入“新增”、“刪除”、“修改”、“放棄”和“查找”鈕,通過(guò)對(duì)5個(gè)按紐的編程建立增、刪、改、查功能,如圖9.11所示。圖9.11

44、編程建立增、刪、改、查功能 Command1_Click事件的功能根據(jù)按鈕提示文字調(diào)用AddNew方法或Update方法,并且控制具他4個(gè)按鈕的可用性。當(dāng)按鈕提示為“新增”時(shí)調(diào)用AddNew方法,并將提示文字改為“確認(rèn)”,同時(shí)使“刪除”按鈕Command2、“修改”按鈕Command3和“查找”按鈕Command5不可用,而使“放棄”按鈕Command4可用。新增記錄后,需再次單擊Command1調(diào)用Update方法確認(rèn)添加的記錄,再將提示文字再改為“新增”,并使“刪除”、“修改”和“查找”按鈕可用,而使“放棄”按鈕不可用。程序中出現(xiàn)的On Error Resume Next語(yǔ)句是Visual

45、 Basic提供的錯(cuò)誤捕獲語(yǔ)句。該語(yǔ)句表示在程序運(yùn)行時(shí)發(fā)生錯(cuò)誤,忽略錯(cuò)誤行,繼續(xù)執(zhí)行下一語(yǔ)句。Private Sub Command1_Click() On Error Resume Next Command2.Enabled = Not Command2.Enabled Command3.Enabled = Not Command3.Enabled Command4.Enabled = Not Command4.Enabled Command5.Enabled = Not Command5.Enabled If Command1.Caption = "新增" Then C

46、ommand1.Caption = "確認(rèn)" Text1.SetFocus Else Command1.Caption = "新增" End IfEnd Sub 命令按鈕Command2_Click事件調(diào)用方法刪除當(dāng)前記錄。當(dāng)記錄集中的記錄全部被刪除后,再執(zhí)行Move語(yǔ)句將發(fā)生錯(cuò)誤,這時(shí)由On Error Resume Next語(yǔ)句處理錯(cuò)誤。Private Sub Command2_Click() On Error Resume NextEnd Sub 命令按鈕Command3_Click事件的編程思路與Command1_Click事件類(lèi)似,根據(jù)按鈕提示

47、文字調(diào)用Edit方法進(jìn)入編輯狀態(tài)或調(diào)用Update方法將修改后的數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù),并控制其他3個(gè)按鈕的可用性,代碼如下:Private Sub Command3_Click() On Error Resume Next Command1.Enabled = Not Command1.Enabled Command2.Enabled = Not Command2.Enabled Command4.Enabled = Not Command4.Enabled Command5.Enabled = Not Command5.Enabled If Command3.Caption = "修改

48、" Then Command3.Caption = "確認(rèn)" Text1.SetFocus Else Command3.Caption = "修改" End IfEnd Sub命令按鈕Command4_Click事件使用UpdateControls方法放棄操作,代碼如下:Private Sub Command4_Click() On Error Resume Next Command1.Caption = "新增" Command3.Caption = "修改" Command1.Enabled = Tr

49、ue Command2.Enabled = True Command3.Enabled = True Command4.Enabled = False Command5.Enabled = True Data1.UpdateControlsEnd Sub命令按鈕Command5_Click事件根據(jù)輸入專(zhuān)業(yè)使用SQL語(yǔ)句查找記錄,代碼如下:Private Sub Command5_Click()Dim mzy As String mzy = InputBox$("請(qǐng)輸入專(zhuān)業(yè)", "查找窗") Data1.RecordSource = "Selec

50、t * From 基本情況 Where 專(zhuān)業(yè) = '" & mzy & "'" Data1.Refresh If Data1.Recordset.EOF Then MsgBox "無(wú)此專(zhuān)業(yè)!", , "提示" Data1.RecordSource = "基本情況" Data1.Refresh End IfEnd Sub 上面的代碼給出了數(shù)據(jù)表內(nèi)數(shù)據(jù)處理的基本方法。需要注意的是:對(duì)于一條新記錄或編輯過(guò)的記錄必須要保證數(shù)據(jù)的完整性,這可通過(guò)Data1_Validate事件過(guò)濾無(wú)

51、效記錄。例如,下面的代碼對(duì)學(xué)號(hào)字段進(jìn)行測(cè)試,如果學(xué)號(hào)為空則輸入無(wú)效。在本例中被學(xué)號(hào)字段所約束的綁定控件是Text1,可用Text1.DataChanged屬性檢測(cè)Text1控件所對(duì)應(yīng)的當(dāng)前記錄中的字段值的內(nèi)容是否發(fā)生了變化,Action=6表示Update操作(參見(jiàn)表9.5)。此外,使用數(shù)據(jù)控件對(duì)象的任一箭頭按鈕來(lái)改變當(dāng)前記錄,也可確定所做添加的新記錄或?qū)σ延杏涗浀男薷?,Action取值14分別對(duì)應(yīng)單擊其中一個(gè)箭頭按鈕的操作,當(dāng)單擊數(shù)據(jù)控件的箭頭按鈕時(shí)也觸發(fā)Validate事件。Private Sub Data1_Validate(Action As Integer, Save As Inte

52、ger) If Text1.Text = "" And (Action = 6 Or Text1.DataChanged) Then MsgBox "數(shù)據(jù)不完整,必須要有學(xué)號(hào)!" Data1.UpdateControls End If If Action >= 1 And Action <= 4 Then Command1.Caption = "新增" Command3.Caption = "修改" Command1.Enabled = True Command2.Enabled = True Comm

53、and3.Enabled = True Command4.Enabled = False End IfEnd Sub關(guān)于照片的輸入,較簡(jiǎn)單的方法是通過(guò)剪貼板將照片圖片復(fù)制到Picture1控件。在輸入照片時(shí),事先需要用掃描儀將照片掃描到內(nèi)存或形成圖形文件,通過(guò)一個(gè)圖片編輯程序?qū)⒄掌b入剪貼板,然后再?gòu)募糍N板復(fù)制到Picture1控件。本例通過(guò)Picture1_DblClick事件來(lái)完成剪貼板到Picture1控件的復(fù)制,當(dāng)移動(dòng)記錄指針時(shí),Picture1控件內(nèi)的照片存入數(shù)據(jù)庫(kù),此外,也可以使用OLE拖放技術(shù)將照片圖形文件拖放到Picture1控件或其他圖形容器內(nèi)。Private Sub Pic

54、ture1_DblClick()Picture1.Picture = Clipboard.GetDataEnd Sub94 ODBC941 ODBC概述在傳統(tǒng)的數(shù)據(jù)庫(kù)管理系統(tǒng)中,每個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)都有自己的應(yīng)用程序開(kāi)發(fā)接口(API),應(yīng)用程序使用數(shù)據(jù)庫(kù)系統(tǒng)所提供的專(zhuān)用開(kāi)發(fā)工具(如嵌入式SQL語(yǔ)言)進(jìn)行開(kāi)發(fā),這樣的應(yīng)用程序只能運(yùn)行在特定的數(shù)據(jù)庫(kù)系統(tǒng)環(huán)境下,適應(yīng)性和可移植性比較差。在用戶(hù)硬件平臺(tái)或操作系統(tǒng)發(fā)生變化時(shí),應(yīng)用程序需要重新編寫(xiě)。嵌入式SQL語(yǔ)言的另一個(gè)缺點(diǎn)是它只能存取某種特定的數(shù)據(jù)庫(kù)系統(tǒng),因此一個(gè)應(yīng)用程序只能連接同類(lèi)的DBMS,而無(wú)法同時(shí)訪問(wèn)多個(gè)不同的DBMS,而在實(shí)際應(yīng)用中通常是需要同

55、時(shí)訪問(wèn)多個(gè)不同的DBMS的。例如,在一個(gè)單位中,財(cái)務(wù)、生產(chǎn)和技術(shù)等部門(mén)常根據(jù)自身專(zhuān)業(yè)的特點(diǎn)選擇不同的DBMS,而建立企業(yè)級(jí)管理信息系統(tǒng)時(shí),需要同時(shí)訪問(wèn)各個(gè)部門(mén)的數(shù)據(jù)庫(kù)。這種情況下傳統(tǒng)的數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)方法就難以實(shí)現(xiàn)。為了解決這些問(wèn)題,微軟公司開(kāi)發(fā)了ODBC(Open DataBase Connectivity,即開(kāi)放數(shù)據(jù)庫(kù)互連)。ODBC 是Microsoft公司開(kāi)發(fā)的一套開(kāi)放數(shù)據(jù)庫(kù)系統(tǒng)應(yīng)用程序接口規(guī)范,目前它已成為一種工業(yè)標(biāo)準(zhǔn),它提供了統(tǒng)一的數(shù)據(jù)庫(kù)應(yīng)用編程接口(API),為應(yīng)用程序提供了一套高層調(diào)用接口規(guī)范和基于動(dòng)態(tài)連接庫(kù)的運(yùn)行支持環(huán)境。使用ODBC開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用時(shí),應(yīng)用程序調(diào)用的是標(biāo)準(zhǔn)的ODBC函數(shù)和SQL語(yǔ)句,數(shù)據(jù)庫(kù)底層操作由各個(gè)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序完成。因此應(yīng)用程序有很好的適應(yīng)性和可移植性,并且具備了同時(shí)訪問(wèn)多種數(shù)據(jù)庫(kù)管理系統(tǒng)的能力,從而徹底克服了傳統(tǒng)數(shù)據(jù)庫(kù)應(yīng)用程序的缺陷。942 ODBC體系結(jié)構(gòu)ODBC驅(qū)動(dòng)程序類(lèi)似于Windo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論