第9章_數(shù)據(jù)庫_第1頁
第9章_數(shù)據(jù)庫_第2頁
第9章_數(shù)據(jù)庫_第3頁
第9章_數(shù)據(jù)庫_第4頁
第9章_數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 2第第 9 章章 VB數(shù)據(jù)庫訪問技術(shù)數(shù)據(jù)庫訪問技術(shù) ADO數(shù)據(jù)控件數(shù)據(jù)控件 數(shù)據(jù)控件數(shù)據(jù)控件 本地數(shù)據(jù)庫設(shè)計本地數(shù)據(jù)庫設(shè)計 數(shù)據(jù)庫概述數(shù)據(jù)庫概述 VB中中SQL的實現(xiàn)的實現(xiàn) VB中使用中使用ODBC 39.1 數(shù)據(jù)庫概述數(shù)據(jù)庫概述9.1.1 VB中的數(shù)據(jù)訪問中的數(shù)據(jù)訪問VB中兩種與數(shù)據(jù)庫相連接口方法:中兩種與數(shù)據(jù)庫相連接口方法: Data控件控件(Data Control)和數(shù)據(jù)訪問對象和數(shù)據(jù)訪問對象(DAO) VB通過通過DAO和和Jet引擎可識別三類數(shù)據(jù)庫:引擎可識別三類數(shù)據(jù)庫: VB數(shù)據(jù)庫:也稱本地數(shù)據(jù)庫數(shù)據(jù)庫:也稱本地數(shù)據(jù)庫 ,數(shù)據(jù)庫文件使用與,數(shù)據(jù)庫文件使用與Microsoft A

2、ccess相同的格式相同的格式 外部數(shù)據(jù)庫:包括外部數(shù)據(jù)庫:包括dDase ,dBase ,F(xiàn)oxPro 2.0、2.5以及以及Paradox 3.x、4.x ODBC數(shù)據(jù)庫:包括符合數(shù)據(jù)庫:包括符合ODBC標(biāo)準的客戶標(biāo)準的客戶-服務(wù)器數(shù)據(jù)服務(wù)器數(shù)據(jù)庫,如庫,如Microsoft SQL Server 49.1.2 VB數(shù)據(jù)庫體系結(jié)構(gòu)數(shù)據(jù)庫體系結(jié)構(gòu)1VB數(shù)據(jù)庫應(yīng)用程序的組成數(shù)據(jù)庫應(yīng)用程序的組成VB數(shù)據(jù)庫應(yīng)用程序包含三部分,如圖數(shù)據(jù)庫應(yīng)用程序包含三部分,如圖9-1所示所示 圖9-1 VB數(shù)據(jù)庫應(yīng)用程序應(yīng)用程序的組成 5v(1) 用戶界面和應(yīng)用程序代碼用戶界面和應(yīng)用程序代碼 用戶界面是用戶所看見的

3、用于交互的界面,它包括顯示數(shù)據(jù)并允許用用戶界面是用戶所看見的用于交互的界面,它包括顯示數(shù)據(jù)并允許用戶查看或更新數(shù)據(jù)的窗體。驅(qū)動這些窗體的是應(yīng)用程序的戶查看或更新數(shù)據(jù)的窗體。驅(qū)動這些窗體的是應(yīng)用程序的VB代碼,代碼,包括用來請求數(shù)據(jù)庫服務(wù)的數(shù)據(jù)訪問對象和方法,比如添加或刪除記包括用來請求數(shù)據(jù)庫服務(wù)的數(shù)據(jù)訪問對象和方法,比如添加或刪除記錄、執(zhí)行查詢等。錄、執(zhí)行查詢等。 v(2) Jet引擎引擎 Jet引擎被包含在一組動態(tài)鏈接庫引擎被包含在一組動態(tài)鏈接庫(DLL)文件中。在運行時,文件中。在運行時,這些文件被鏈接到這些文件被鏈接到VB程序。它把應(yīng)用程序的請求翻譯成程序。它把應(yīng)用程序的請求翻譯成對對.

4、mdb(Access文件后綴文件后綴)文件或其他數(shù)據(jù)庫的物理操作。文件或其他數(shù)據(jù)庫的物理操作。它真正讀取、寫入和修改數(shù)據(jù)庫,并處理所有內(nèi)部事務(wù),它真正讀取、寫入和修改數(shù)據(jù)庫,并處理所有內(nèi)部事務(wù),如索引、鎖定、安全性和引用完整性。它還包含一個查詢?nèi)缢饕?、鎖定、安全性和引用完整性。它還包含一個查詢處理器,接收并執(zhí)行處理器,接收并執(zhí)行SQL查詢,實現(xiàn)所需的數(shù)據(jù)操作。另查詢,實現(xiàn)所需的數(shù)據(jù)操作。另外,它還包含一個結(jié)果處理器,用來管理查詢所返回的結(jié)外,它還包含一個結(jié)果處理器,用來管理查詢所返回的結(jié)果。果。 6v(3) 數(shù)據(jù)庫數(shù)據(jù)庫v數(shù)據(jù)庫是包含數(shù)據(jù)庫表的一個或多個文件。數(shù)據(jù)庫是包含數(shù)據(jù)庫表的一個或多個文

5、件。對于本地對于本地VB或或Access數(shù)據(jù)庫來說,就數(shù)據(jù)庫來說,就是是.mdb文件。對于文件。對于ISAM數(shù)據(jù)庫,它可能是數(shù)據(jù)庫,它可能是包含包含.dbf(dBase文件后綴文件后綴)文件或其他擴展文件或其他擴展名的文件。或者,應(yīng)用程序可能會訪問保名的文件。或者,應(yīng)用程序可能會訪問保存在幾個不同的數(shù)據(jù)庫文件或格式中的數(shù)存在幾個不同的數(shù)據(jù)庫文件或格式中的數(shù)據(jù)。但無論在什么情況下,數(shù)據(jù)庫本質(zhì)上據(jù)。但無論在什么情況下,數(shù)據(jù)庫本質(zhì)上都是被動的,它包含數(shù)據(jù)但不對數(shù)據(jù)做任都是被動的,它包含數(shù)據(jù)但不對數(shù)據(jù)做任何操作。數(shù)據(jù)操作是數(shù)據(jù)庫引擎的任務(wù)何操作。數(shù)據(jù)操作是數(shù)據(jù)庫引擎的任務(wù) 7v2數(shù)據(jù)庫應(yīng)用程序的存放數(shù)

6、據(jù)庫應(yīng)用程序的這三個部分可以被分別放置在不同數(shù)據(jù)庫應(yīng)用程序的這三個部分可以被分別放置在不同的位置上??梢园阉鼈兌挤旁谝慌_計算機上,供單用的位置上??梢园阉鼈兌挤旁谝慌_計算機上,供單用戶應(yīng)用程序使用,也可以放置在通過網(wǎng)絡(luò)連接起來的戶應(yīng)用程序使用,也可以放置在通過網(wǎng)絡(luò)連接起來的不同計算機上。例如,數(shù)據(jù)庫可以駐留在中央服務(wù)器不同計算機上。例如,數(shù)據(jù)庫可以駐留在中央服務(wù)器上,而用戶界面上,而用戶界面(即應(yīng)用程序即應(yīng)用程序)則駐留在幾個客戶機上,則駐留在幾個客戶機上,讓許多用戶訪問相同的數(shù)據(jù)。讓許多用戶訪問相同的數(shù)據(jù)。 8圖圖9-2 客戶客戶-服務(wù)器數(shù)據(jù)庫與遠程數(shù)據(jù)庫的不同點服務(wù)器數(shù)據(jù)庫與遠程數(shù)據(jù)庫的不

7、同點 99.2 本地數(shù)據(jù)庫設(shè)計vVB中創(chuàng)建數(shù)據(jù)庫的途徑主要如下。中創(chuàng)建數(shù)據(jù)庫的途徑主要如下。 可視化數(shù)據(jù)管理器:使用可視化數(shù)據(jù)管理器,不可視化數(shù)據(jù)管理器:使用可視化數(shù)據(jù)管理器,不需要編程就可以創(chuàng)建需要編程就可以創(chuàng)建Jet數(shù)據(jù)庫。數(shù)據(jù)庫。 DAO:使用:使用VB的的DAO部件可以通過編程的方法部件可以通過編程的方法創(chuàng)建數(shù)據(jù)庫。創(chuàng)建數(shù)據(jù)庫。 Microsoft Access:因為:因為Microsoft Access使使用了與用了與VB相同的數(shù)據(jù)庫引擎和格式,所以,用相同的數(shù)據(jù)庫引擎和格式,所以,用Microsoft Access創(chuàng)建的數(shù)據(jù)庫和直接在創(chuàng)建的數(shù)據(jù)庫和直接在VB中中創(chuàng)建的數(shù)據(jù)庫是一樣的

8、。創(chuàng)建的數(shù)據(jù)庫是一樣的。 數(shù)據(jù)庫應(yīng)用程序:像數(shù)據(jù)庫應(yīng)用程序:像FoxPro、dBase或或ODBC客戶客戶-服務(wù)器應(yīng)用程序這樣的產(chǎn)品,可以作為外部服務(wù)器應(yīng)用程序這樣的產(chǎn)品,可以作為外部數(shù)據(jù)庫,數(shù)據(jù)庫,VB可通過可通過ISAM或或ODBC驅(qū)動程序來訪驅(qū)動程序來訪問這些數(shù)據(jù)庫。問這些數(shù)據(jù)庫。 109.2.2 數(shù)據(jù)庫建立及操作數(shù)據(jù)庫建立及操作 v1建立數(shù)據(jù)庫建立數(shù)據(jù)庫student.mdb(學(xué)生數(shù)據(jù)庫學(xué)生數(shù)據(jù)庫) :v基本情況基本情況(學(xué)號,姓名,性別,專業(yè),出生年月,學(xué)號,姓名,性別,專業(yè),出生年月,照片,備注照片,備注);v學(xué)生成績表學(xué)生成績表(學(xué)號,課程,成績,學(xué)期學(xué)號,課程,成績,學(xué)期)。v

9、(1) 建立數(shù)據(jù)庫結(jié)構(gòu)建立數(shù)據(jù)庫結(jié)構(gòu)單擊單擊“文件文件”“新建新建”“Microsoft Access”“版本版本7.0 MDB”命令,在命令,在“選擇要創(chuàng)選擇要創(chuàng)建的建的Microsoft Access數(shù)據(jù)庫數(shù)據(jù)庫”窗口中選定新建窗口中選定新建數(shù)據(jù)庫的路徑并輸入數(shù)據(jù)庫名,這里為數(shù)據(jù)庫的路徑并輸入數(shù)據(jù)庫名,這里為student.mdb。 11v(2) 添加數(shù)據(jù)表添加數(shù)據(jù)表v將鼠標(biāo)移到數(shù)據(jù)庫窗口區(qū)域內(nèi),單擊鼠標(biāo)將鼠標(biāo)移到數(shù)據(jù)庫窗口區(qū)域內(nèi),單擊鼠標(biāo)右鍵,在彈出的菜單中選擇右鍵,在彈出的菜單中選擇“新建表新建表”命命令,出現(xiàn)令,出現(xiàn)“表結(jié)構(gòu)表結(jié)構(gòu)”對話框,利用該對話對話框,利用該對話框可以建立數(shù)據(jù)表

10、的結(jié)構(gòu)??蚩梢越?shù)據(jù)表的結(jié)構(gòu)。 v按順序輸入按順序輸入“姓名姓名”、“性別性別”、“專專業(yè)業(yè)”、“出生年月出生年月”、“照片照片”、“備注備注”字段,然后單擊字段,然后單擊“關(guān)閉關(guān)閉”按鈕返回按鈕返回“表結(jié)表結(jié)構(gòu)構(gòu)”對話框。對話框。 12v(3) 建立索引v單擊“添加索引”按鈕,會出現(xiàn)如圖9-4所示的對話框,通過此對話框可以將數(shù)據(jù)表的某些字段設(shè)置為索引。在“名稱”文本框中輸入索引的名稱,然后從下邊的“可用字段”列表框中選擇作為索引的字段,這里選擇的是“學(xué)號”。 圖9-4 設(shè)置索引 13v2錄入數(shù)據(jù)數(shù)據(jù)管理器提供了簡單的數(shù)據(jù)錄入功能。在工具欄上單擊DBGrid顯示風(fēng)格的按鈕,然后在要錄入數(shù)據(jù)的

11、數(shù)據(jù)表上單擊鼠標(biāo)右鍵,選擇“打開”命令,則出現(xiàn)以網(wǎng)格風(fēng)格顯示數(shù)據(jù)的窗口,如果此表中已有數(shù)據(jù),則此時顯示出此表中的全部數(shù)據(jù);若此表中無數(shù)據(jù),則顯示出一個空表。如圖9-5所示,這里是以“基本情況”表為例,并且輸入了部分數(shù)據(jù)后的情況 14圖圖9-5 顯示數(shù)據(jù)顯示數(shù)據(jù) 153建立查詢VB的數(shù)據(jù)管理器提供了一個圖形化的設(shè)置查詢條件的窗口查詢生成器。選擇“實用程序”菜單下的“查詢生成器”命令,或在數(shù)據(jù)庫窗口區(qū)域單擊鼠標(biāo)右鍵,然后在彈出的菜單中選擇“新查詢”命令,即可出現(xiàn)“查詢生成器”對話框,如圖9-6所示。 16圖圖9-6 “查詢生成器查詢生成器”對話框?qū)υ捒?17假設(shè)要查詢學(xué)號為110002的學(xué)生的基本

12、情況,可按下述步驟進行。 首先選擇要進行查詢的數(shù)據(jù)表,單擊“表”列表框中的“基本情況”表。 在“字段名稱”下拉列表框中選定“基本情況.學(xué)號”。 單擊“運算符”下拉列表框,選擇“=”。 單擊“列出可能的值”按鈕,在“值”中輸入110002。 單擊“將And加入條件”按鈕,將條件加入“條件”列表框中。 在“要顯示的字段”列表框中,選定需要顯示的字段。注意,這里所選的字段就是在查詢結(jié)果中要查看的字段。 單擊“運行”按鈕,在隨后出現(xiàn)的VisData對話框中,選擇“否”,并進一步選擇“運行”,即可看到查詢結(jié)果。 單擊“顯示”按鈕,在隨后出現(xiàn)的“SQL Query”窗口中,會顯示剛建立的查詢所對應(yīng)的SQL

13、語句。 189.3 數(shù)據(jù)控件9.3.1 數(shù)據(jù)控件的屬性數(shù)據(jù)控件的屬性1Connect屬性屬性 Connect屬性指定數(shù)據(jù)控件所要連接的數(shù)據(jù)庫類屬性指定數(shù)據(jù)控件所要連接的數(shù)據(jù)庫類型,型,Visual Basic默認的數(shù)據(jù)庫是默認的數(shù)據(jù)庫是Access的的MDB文件,此外也可連接文件,此外也可連接DBF、XLS、ODBC等等類型的數(shù)據(jù)庫。類型的數(shù)據(jù)庫。 2DatabaseName屬性屬性 DatabaseName屬性指定具體使用的數(shù)據(jù)庫文件屬性指定具體使用的數(shù)據(jù)庫文件名,包括所有的路徑名。如果連接的是單表數(shù)據(jù)名,包括所有的路徑名。如果連接的是單表數(shù)據(jù)庫,則庫,則DatabaseName屬性應(yīng)設(shè)置為

14、數(shù)據(jù)庫文件屬性應(yīng)設(shè)置為數(shù)據(jù)庫文件所在的子目錄名,而具體文件名放在所在的子目錄名,而具體文件名放在RecordSource屬性中。屬性中。 193RecordSource屬性屬性 RecordSource確定具體可訪問的數(shù)據(jù),這些數(shù)確定具體可訪問的數(shù)據(jù),這些數(shù)據(jù)構(gòu)成記錄集對象據(jù)構(gòu)成記錄集對象Recordset。該屬性值可以是數(shù)。該屬性值可以是數(shù)據(jù)庫中的單個表名,可以是一個存儲查詢,也可以據(jù)庫中的單個表名,可以是一個存儲查詢,也可以是使用是使用SQL查詢語言的一個查詢字符串。查詢語言的一個查詢字符串。 4RecordType屬性屬性 RecordType屬性確定記錄集類型。屬性確定記錄集類型。5E

15、ofAction和和BofAction屬性屬性 當(dāng)記錄指針指向當(dāng)記錄指針指向Recordset對象的開始對象的開始(第一個第一個記錄前記錄前)或結(jié)束或結(jié)束(最后一個記錄后最后一個記錄后)時,數(shù)據(jù)控件的時,數(shù)據(jù)控件的EofAction和和BofAction屬性的設(shè)置或返回值決定了屬性的設(shè)置或返回值決定了數(shù)據(jù)控件要采取的操作。屬性的取值見表數(shù)據(jù)控件要采取的操作。屬性的取值見表9-1。 20表9-1 EofAction和BofAction屬性屬性取值操作BofAction0控件重定位到第一個記錄1移過記錄集開始位,定位到一個無效記錄,觸發(fā)數(shù)據(jù)控件對第一個記錄的無效事件ValidateEofActio

16、n0控件重定位到最后一個記錄1移過記錄集結(jié)束位,定位到一個無效記錄,觸發(fā)數(shù)據(jù)控件對最后一個記錄的無效事件Validate2向記錄集加入新的空記錄,可以對新記錄進行編輯,移動記錄指針,新記錄寫入數(shù)據(jù)庫 21 在Visual Basic中,數(shù)據(jù)控件本身不能直接顯示記錄集中的數(shù)據(jù),必須通過能與它綁定的控件來實現(xiàn)。可與數(shù)據(jù)控件綁定的控件對象有文本框、標(biāo)簽、圖像框、圖形框、列表框、組合框、復(fù)選框、網(wǎng)格、DB列表框、DB組合框、DB網(wǎng)格、OLE容器等控件。要使綁定控件能被數(shù)據(jù)庫約束,必須在設(shè)計或運行時對這些控件的兩個屬性進行設(shè)置。 (1) DataSource屬性DataSource屬性通過指定一個有效的

17、數(shù)據(jù)控件連接到一個數(shù)據(jù)庫上。(2) DataField屬性DataField屬性設(shè)置數(shù)據(jù)庫有效的字段與綁定控件建立聯(lián)系。綁定控件、數(shù)據(jù)控件和數(shù)據(jù)庫三者的關(guān)系如圖9-7所示。圖9-7 綁定控件、數(shù)據(jù)控件和數(shù)據(jù)庫三者的關(guān)系 22v例例9.1 建立建立student.mdb數(shù)據(jù)庫,它包含數(shù)據(jù)庫,它包含兩個表:兩個表:“基本情況表基本情況表”和和“學(xué)生成績學(xué)生成績表表”,見表,見表9-2和表和表9-3。表9-2 基本情況表結(jié)構(gòu)字段名類型寬度學(xué)號Text6姓名Text10性別Text2專業(yè)Text10出生年月Date8照片Binary0 23表9-3 學(xué)生成績表結(jié)構(gòu)字段名類型寬度學(xué)號Text6課程Tex

18、t10成績Long4學(xué)期Text2 24v例9.2 設(shè)計一個窗體用于顯示建立的student.mdb數(shù)據(jù)庫中基本情況表的內(nèi)容。 參考如圖9-8所示窗體,在窗體上放置1個數(shù)據(jù)控件、1個圖形框、5個文本框和5個標(biāo)簽控件。5個標(biāo)簽控件分別給出相關(guān)的提示說明。 圖圖9-8 顯示顯示student.mdb基本情況表的數(shù)據(jù)基本情況表的數(shù)據(jù) 25 將數(shù)據(jù)控件將數(shù)據(jù)控件Data1的的Connect屬性指定為屬性指定為Access類類型,型,DatabaseName屬性連接數(shù)據(jù)庫屬性連接數(shù)據(jù)庫student.mdb,RecordSource屬性設(shè)置為屬性設(shè)置為“基本情況基本情況”。 圖形框和圖形框和5個文本框控

19、件個文本框控件Text1Text5的的DataSource屬性都設(shè)置成屬性都設(shè)置成Data1。通過單擊這些綁。通過單擊這些綁定控件的定控件的DataField屬性上的屬性上的“”按鈕,將顯示基按鈕,將顯示基本情況表所含的全部字段,分別選擇與其對應(yīng)的字本情況表所含的全部字段,分別選擇與其對應(yīng)的字段照片、學(xué)號、姓名、性別、專業(yè)和出生年月,使段照片、學(xué)號、姓名、性別、專業(yè)和出生年月,使之建立約束關(guān)系。之建立約束關(guān)系。 26v例9.3 用數(shù)據(jù)網(wǎng)格控件MsFlexGrid顯示student.mdb數(shù)據(jù)庫中基本情況表的內(nèi)容。 MsFlexGrid控件不是Visual Basic工具箱內(nèi)的默認控件,需要在開

20、發(fā)環(huán)境中選擇“工程”“部件”命令,并在隨即出現(xiàn)的對話框中選擇“MicroSoft FlexGrid Control 6.0”選項,將其添加到工具箱中。 表9-4 控件屬性默認控件名其他屬性設(shè)置Data1DatabaseName=c:student.mdbRecordsetType=0RecordSource=基本情況MSFlexGrid1DataSource=Data1FixedCols=0 27圖圖9-9 使用數(shù)據(jù)網(wǎng)格控件使用數(shù)據(jù)網(wǎng)格控件 289.3.2 數(shù)據(jù)控件的事件1Reposition事件 Reposition事件發(fā)生在一條記錄成為當(dāng)前記錄后,只要改變記錄集的指針使其從一條記錄移到另一

21、條記錄,會產(chǎn)生Reposition事件。 在例9.2的Data1_Reposition事件中加入如下代碼:Private Sub Data1_Reposition( ) Data1.Caption = Data1.Recordset.AbsolutePosition + 1End Sub這里,Recordset為記錄集對象,AbsolutePosition屬性指示當(dāng)前指針值(從0開始)。當(dāng)單擊數(shù)據(jù)控件對象上的箭頭按鈕時,數(shù)據(jù)控件的標(biāo)題區(qū)會顯示記錄的序號 292Validate事件當(dāng)要移動記錄指針、修改與刪除記錄前或卸載含有數(shù)據(jù)控件的窗體時都會觸發(fā)Validate事件。Validate事件檢查被

22、數(shù)據(jù)控件綁定的控件內(nèi)的數(shù)據(jù)是否發(fā)生變化。它通過Save參數(shù)(True或False)判斷是否有數(shù)據(jù)發(fā)生變化,Action參數(shù)判斷哪一種操作觸發(fā)了Validate事件。參數(shù)可為表9-5中的值。 30表9-5 Validate事件的Action參數(shù)Action值描述Action值描述0取消對數(shù)據(jù)控件的操作6Update1MoveFirst7Delete2MovePrevious8Find3MoveNext12設(shè)置Bookmark4MoveLast10Close5AddNew11卸載窗體 31一般可用一般可用Validate事件來檢查數(shù)據(jù)的有效性。例事件來檢查數(shù)據(jù)的有效性。例如,在例如,在例9.2中,

23、如果不允許用戶在數(shù)據(jù)瀏覽時清中,如果不允許用戶在數(shù)據(jù)瀏覽時清空性別數(shù)據(jù),可使用下列代碼:空性別數(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 329.3.3 數(shù)據(jù)控件的常用方法數(shù)據(jù)控件的常用方法 數(shù)據(jù)控件的內(nèi)置功能很多,可以在代碼中用數(shù)據(jù)控數(shù)據(jù)控件的內(nèi)置功能很多,可以在代碼中用數(shù)據(jù)控件的方法訪問這些屬性。件的方法訪問這些屬性。1Re

24、fresh方法方法如果在設(shè)計狀態(tài)沒有為打開數(shù)據(jù)庫控件的有關(guān)屬性如果在設(shè)計狀態(tài)沒有為打開數(shù)據(jù)庫控件的有關(guān)屬性全部賦值,或當(dāng)全部賦值,或當(dāng)RecordSource在運行時被改變后,在運行時被改變后,必須使用數(shù)據(jù)控件的必須使用數(shù)據(jù)控件的Refresh方法激活這些變化。在方法激活這些變化。在多用戶環(huán)境下,當(dāng)其他用戶同時訪問同一數(shù)據(jù)庫和多用戶環(huán)境下,當(dāng)其他用戶同時訪問同一數(shù)據(jù)庫和表時,表時,Refresh方法將使各用戶對數(shù)據(jù)庫的操作有效。方法將使各用戶對數(shù)據(jù)庫的操作有效。 33例如,將例9.2的設(shè)計參數(shù)改用代碼實現(xiàn),使所連接數(shù)據(jù)庫所在的文件夾可隨程序而變化:Private Sub Form_Load(

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

26、rols方法終止用戶對綁定控件方法終止用戶對綁定控件內(nèi)數(shù)據(jù)的修改。內(nèi)數(shù)據(jù)的修改。例如,將代碼例如,將代碼Data1.UpdateControts放在一個命放在一個命令按鈕的令按鈕的Click事件中,就可以實現(xiàn)對記錄修改事件中,就可以實現(xiàn)對記錄修改的功能。的功能。 353UpdateRecord方法當(dāng)對綁定控件內(nèi)的數(shù)據(jù)修改后,數(shù)據(jù)控件需要移動記錄集的指針才能保存修改。如果使用UpdateRecord方法,可強制數(shù)據(jù)控件將綁定控件內(nèi)的數(shù)據(jù)寫入數(shù)據(jù)庫,而不再觸發(fā)Validate事件。在代碼中可以用該方法來確認修改。 369.3.4 記錄集的屬性與方法記錄集的屬性與方法 由RecordSource確定

27、的具體可訪問的數(shù)據(jù)構(gòu)成的記錄集Recordset也是一個對象,因而,它和其他對象一樣具有屬性和方法。下面列出記錄集常用的屬性和方法。1AbsolutePosition屬性AbsolutePosition返回當(dāng)前指針值,如果是第1條記錄,其值為0,該屬性為只讀屬性。2Bof和Eof的屬性Bof判定記錄指針是否在首記錄之前,若Bof為True,則當(dāng)前位置位于記錄集的第1條記錄之前。與此類似,Eof判定記錄指針是否在末記錄之后。3Bookmark屬性Bookmark屬性的值采用字符串類型,用于設(shè)置或返回當(dāng)前指針的標(biāo)簽。在程序中可以使用Bookmark屬性重定位記錄集的指針,但不能使用Absolute

28、Postion屬性。 374Nomatch屬性在記錄集中進行查找時,如果找到相匹配的記錄,則Recordset的NoMatch屬性為False,否則為True。該屬性常與Bookmark屬性一起使用。5RecordCount屬性RecordCount屬性對Recordset對象中的記錄計數(shù),該屬性為只讀屬性。在多用戶環(huán)境下,RecordCount屬性值可能不準確,為了獲得準確值,在讀取RecordCount屬性值之前,可使用MoveLast方法將記錄指針移至最后一條記錄上。 386Move方法方法使用使用Move方法可代替對數(shù)據(jù)控件對象的方法可代替對數(shù)據(jù)控件對象的4個箭頭個箭頭按鈕來遍歷整個記

29、錄集。按鈕來遍歷整個記錄集。5種種Move方法如下。方法如下。 MoveFirst方法:移至第方法:移至第1條記錄。條記錄。 MoveLast方法:移至最后一條記錄。方法:移至最后一條記錄。 MoveNext方法:移至下一條記錄。方法:移至下一條記錄。 MovePrevious方法:移至上一條記錄。方法:移至上一條記錄。 Move n方法:向前或向后移方法:向前或向后移n條記錄,條記錄,n為指為指定的數(shù)值。定的數(shù)值。 39例9.4 在窗體上用4個命令按鈕代替例9.2數(shù)據(jù)控件對象的4個箭頭按鈕。在例9.2的基礎(chǔ)上,在窗體上增加4個命令按鈕,將數(shù)據(jù)控件的Visible屬性設(shè)置為False,如圖9-

30、10所示。通過對4個命令按鈕的編程代替對數(shù)據(jù)控件對象的4個箭頭按鈕的操作。圖9-10 用按鈕代替數(shù)據(jù)控件對象的箭頭按鈕 40命令按鈕Command1_Click事件移至第1條記錄,代碼如下:Private Sub Command1_Click( ) Data1.Recordset.MoveFirstEnd Sub命令按鈕Command4_Click事件移至最后一條記錄,代碼如下:Private Sub Command4_Click( ) Data1.Recordset.MoveLastEnd Sub 41另外兩個按鈕的代碼需要考慮另外兩個按鈕的代碼需要考慮Recordset對象的邊界的對象的邊

31、界的首尾,如果越界,則用首尾,如果越界,則用MoveFirst方法定位到第方法定位到第1條記錄條記錄或用或用MoveLast方法定位到最后一條記錄。程序代碼如下:方法定位到最后一條記錄。程序代碼如下:Private Sub Command2_Click( ) Data1.Recordset.MovePrevious If Data1.Recordset.Bof Then Data1.Recordset.MoveFirstEnd SubPrivate Sub Command3_Click( ) Data1.Recordset.MoveNext If Data1.Recordset.Eof The

32、n Data1.Recordset.MoveLastEnd Sub 42v7Find方法使用Find方法可在指定的Dynaset或Snapshot類型的Recordset對象中查找與指定條件相符的一條記錄,并使之成為當(dāng)前記錄。4種Find方法如下。 FindFirst方法:從記錄集的開始查找滿足條件的第1條記錄。 FindLast方法:從記錄集的尾部向前查找滿足條件的第l條記錄。 FindNext方法:從當(dāng)前記錄開始查找滿足條件的下一條記錄。 FindPrevious方法:從當(dāng)前記錄開始查找滿足條件的上一條記錄。4種Find方法的語法格式相同:數(shù)據(jù)集合.Find方法 條件條件是一個指定字段與常

33、量關(guān)系的字符串表達式。在構(gòu)造表達式時,除了用普通的關(guān)系運算外,還可以用Like運算符。 438Seek方法使用使用Seek方法必須打開表的索引,它在方法必須打開表的索引,它在Table表中表中查找與指定索引規(guī)則相符的第查找與指定索引規(guī)則相符的第1條記錄,并使之成為條記錄,并使之成為當(dāng)前記錄。其語法格式為:當(dāng)前記錄。其語法格式為:數(shù)據(jù)表對象數(shù)據(jù)表對象.Seek Comparison,Keyl,Key2Seek允許接收多個參數(shù),第允許接收多個參數(shù),第1個是比較運算符個是比較運算符Comparison,Seek方法中可用的比較運算符有方法中可用的比較運算符有=、=、=, 110001 459.3.5

34、 數(shù)據(jù)庫記錄的增、刪、改操作數(shù)據(jù)庫記錄的增、刪、改操作需要使用AddNew、Delete、Edit、Update和Refresh方法。它們的語法格式為:數(shù)據(jù)控件.記錄集.方法名1增加記錄AddNew方法可在記錄集中增加新記錄。增加記錄的步驟如下。 調(diào)用AddNew方法。 給各字段賦值。給字段賦值格式為:Recordset.Fields(字段名)=值 調(diào)用Update方法,確定所做的添加,將緩沖區(qū)內(nèi)的數(shù)據(jù)寫入數(shù)據(jù)庫。 46注意:如果使用AddNew方法添加新的記錄,但是沒有使用Update方法而移動到其他記錄,或者關(guān)閉記錄集,那么所做的輸入將全部丟失,而且沒有任何警告。當(dāng)調(diào)用Update方法寫入

35、記錄后,記錄指針自動返回到添加新記錄前的位置上,而不顯示新記錄。為此,可在調(diào)用Update方法后,使用MoveLast方法將記錄指針再次移到新記錄上。 472刪除記錄要從記錄集中刪除記錄的操作分為三步: 定位被刪除的記錄使之成為當(dāng)前記錄。 調(diào)用Delete方法。 移動記錄指針。 注意:在使用Delete方法時,當(dāng)前記錄立即刪除,不加任何的警告或者提示。刪除一條記錄后,被數(shù)據(jù)庫所約束的綁定控件仍舊顯示該記錄的內(nèi)容。因此,必須移動記錄指針?biāo)⑿陆壎丶?,一般采用移至下一記錄的處理方法。在移動記錄指針后,?yīng)該檢查Eof屬性。 483編輯記錄數(shù)據(jù)控件自動提供了修改現(xiàn)有記錄的能力,當(dāng)直接改變被數(shù)據(jù)庫所約束

36、的綁定控件的內(nèi)容后,須單擊數(shù)據(jù)控件對象的任一箭頭按鈕來改變當(dāng)前記錄,確定所做的修改。也可通過程序代碼來修改記錄,使用程序代碼修改當(dāng)前記錄的步驟為: 調(diào)用Edit方法。 給各字段賦值。 調(diào)用Update方法,確定所做的修改。注意:如果要放棄對數(shù)據(jù)的所有修改,可用Refresh方法,重讀數(shù)據(jù)庫,沒有調(diào)用Update方法,數(shù)據(jù)的修改就沒有寫入數(shù)據(jù)庫,所以這樣的記錄會在刷新記錄集時丟失 49例9.5 在例9.2的基礎(chǔ)上加入“新增”、“刪除”、“修改”、“放棄”和“查找”按鈕,通過對5個按鈕的編程建立增、刪、改、查功能,如圖9-11所示 圖9-11 建立增、刪、改、查功能 50Private Sub C

37、ommand1_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 Command1.Caption = 確認 Data1.Recordset.AddNew Text1.SetFocus Else Command

38、1.Caption = 新增 Data1.Recordset.Update Data1.Recordset.MoveLast End IfEnd Sub 51命令按鈕Command2_Click事件調(diào)用方法刪除當(dāng)前記錄。當(dāng)記錄集中的記錄全部被刪除后,再執(zhí)行Move語句將發(fā)生錯誤,這時由On Error Resume Next語句處理錯誤。Private Sub Command2_Click( ) On Error Resume Next Data1.Recordset.Delete Data1.Recordset.MoveNext If Data1.Recordset.Eof Then Dat

39、a1.Recordset.MoveLastEnd Sub 52Private 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 = 修改 Then Command3.Caption = 確認 Data1.

40、Recordset.Edit Text1.SetFocus Else Command3.Caption = 修改 Data1.Recordset.Update End IfEnd Sub 53Private Sub Command4_Click( ) On Error Resume Next Command1.Caption = 新增 Command3.Caption = 修改 Command1.Enabled = True Command2.Enabled = True Command3.Enabled = True Command4.Enabled = False Command5.Ena

41、bled = True Data1.UpdateControls Dala1.Recordset.MoveLastEnd Sub 54Private Sub Command5_Click( ) Dim mzy As String mzy = InputBox$(請輸入專業(yè), 查找窗) Data1.RecordSource = Select * From 基本情況 Where 專業(yè) = & mzy & Data1.Refresh If Data1.Recordset.Eof Then MsgBox 無此專業(yè)!, , 提示 Data1.RecordSource = 基本情況 Dat

42、a1.Refresh End IfEnd Sub 55Private Sub Data1_Validate(Action As Integer, Save As Integer) If Text1.Text = And (Action = 6 Or Text1.DataChanged) Then MsgBox 數(shù)據(jù)不完整,必須要有學(xué)號! Data1.UpdateControls End If If Action = 1 And Action = 4 Then Command1.Caption = 新增 Command3.Caption = 修改 Command1.Enabled = True

43、Command2.Enabled = True Command3.Enabled = True Command4.Enabled = False End IfEnd Sub 569.4 ADO數(shù)據(jù)控件9.4.1 ADO對象模型 圖9-12 ADO對象模型 57表9-6 ADO對象描述對象名描述Connection連接數(shù)據(jù)來源Command從數(shù)據(jù)源獲取所需數(shù)據(jù)的命令信息Recordset所獲得的一組記錄組成的記錄集Error在訪問數(shù)據(jù)時,由數(shù)據(jù)源所返回的錯誤信息Parameter與命令對象有關(guān)的參數(shù)Field包含了記錄集中某個字段的信息 589.4.2 使用ADO數(shù)據(jù)控件在使用ADO數(shù)據(jù)控件前,

44、必須先通過“工程”“部件”命令選擇“Microsoft ADO Data Control 6.0(OLEDB)”選項,將ADO數(shù)據(jù)控件添加到工具箱。ADO數(shù)據(jù)控件與Visual Basic的內(nèi)部Data控件很相似,它允許使用ADO數(shù)據(jù)控件的基本屬性快速地創(chuàng)建與數(shù)據(jù)庫的連接。 1ADO數(shù)據(jù)控件的基本屬性(1) ConnectionString屬性ADO控件沒有DatabaseName屬性,它使用ConnectionString屬性與數(shù)據(jù)庫建立連接。該屬性包含了用于與數(shù)據(jù)源建立連接的相關(guān)信息,ConnectionString屬性帶有4個參數(shù),見表9-7。 59表9-7 ConnectionStri

45、ng屬性參數(shù)參數(shù)描述Provide指定數(shù)據(jù)源的名稱FileName指定數(shù)據(jù)源所對應(yīng)的文件名RemoteProvide在遠程數(shù)據(jù)服務(wù)器打開一個客戶端時所用的數(shù)據(jù)源名稱RemoteServer在遠程數(shù)據(jù)服務(wù)器打開一個主機端時所用的數(shù)據(jù)源名稱 60(2) RecordSource屬性RecordSource屬性確定具體可訪問的數(shù)據(jù),這些數(shù)據(jù)構(gòu)成記錄集對象Recordset。該屬性值可以是數(shù)據(jù)庫中的單個表名,一個存儲查詢,也可以是使用SQL查詢語言的一個查詢字符串。(3) ConnectionTimeout屬性該屬性用于數(shù)據(jù)連接的超時設(shè)置,若在指定時間內(nèi)連接不成功則顯示超時信息。(4) MaxReco

46、rds屬性該屬性定義從一個查詢中最多能返回的記錄數(shù) 612ADO數(shù)據(jù)控件的方法和事件ADO數(shù)據(jù)控件的方法和事件與Data控件的方法和事件完全一樣。3設(shè)置ADO數(shù)據(jù)控件的屬性下面通過使用ADO數(shù)據(jù)控件連接student.mdb數(shù)據(jù)庫來說明ADO數(shù)據(jù)控件屬性的設(shè)置。步驟1:在窗體上放置ADO數(shù)據(jù)控件,控件名采用默認名Adodcl。步驟2:單擊ADO控件屬性窗口中的ConnectionString屬性右邊的“”按鈕,彈出“屬性頁”對話框。在該對話框中允許通過三種不同的方式連接數(shù)據(jù)源。“使用連接字符串”只需要單擊“生成”按鈕,通過選項設(shè)置自動產(chǎn)生連接字符串?!笆褂肈ata Link文件”表示通過一個連

47、接文件來完成?!笆褂肙DBC數(shù)據(jù)資源名稱”可以通過下拉列表框,選擇某個創(chuàng)建好的數(shù)據(jù)源名稱(DSN),作為數(shù)據(jù)來源對遠程數(shù)據(jù)庫進行控制。 62步驟步驟3:采用:采用“使用連接字符串使用連接字符串”方式連接數(shù)據(jù)源。方式連接數(shù)據(jù)源。單擊單擊“生成生成”按鈕,打開按鈕,打開“數(shù)據(jù)鏈接屬性數(shù)據(jù)鏈接屬性”對話框。對話框。在在“提供者提供者”選項卡內(nèi)選擇一個合適的選項卡內(nèi)選擇一個合適的OLE DB數(shù)數(shù)據(jù)源,據(jù)源,student.mdb是是Access數(shù)據(jù)庫,選擇數(shù)據(jù)庫,選擇“Microsoft Jet 3.51 OLE DB Provider”選項。然選項。然后單擊后單擊“下一步下一步”按鈕或打開按鈕或打開

48、“連接連接”選項卡,在選項卡,在對話框內(nèi)指定數(shù)據(jù)庫文件,這里為對話框內(nèi)指定數(shù)據(jù)庫文件,這里為student.mdb。為保證連接有效,可單擊為保證連接有效,可單擊“連接連接”選項卡右下方的選項卡右下方的“測試連接測試連接”按鈕,如果測試成功則關(guān)閉按鈕,如果測試成功則關(guān)閉ConnectionString屬性頁。屬性頁。步驟步驟4:單擊:單擊ADO控件屬性窗口中的控件屬性窗口中的RecordSource屬性右邊的屬性右邊的“”按鈕,彈出記錄源屬性頁對話框。按鈕,彈出記錄源屬性頁對話框。 639.5 VB中SQL的實現(xiàn)例9.8 將例9.5中的查找功能改用SQL語句處理,顯示某專業(yè)的學(xué)生記錄 Priva

49、te Sub Command5_Click( ) Dim mzy As String mzy = InputBox$(請輸入專業(yè), 查找窗) Data1.RecordSource = Select * From 基本情況 Where 專業(yè) = & mzy & Data1.Refresh If Data1.Recordset.Eof Then MsgBox 無此專業(yè)!, , 提示 Data1.RecordSource = 基本情況 Data1.Refresh End IfEnd Sub 64Private Sub Command5_Click( ) Dim mzy As Stri

50、ng mzy = InputBox$(請輸入專業(yè), 查找窗) Data1.RecordSource = Select * From 基本情況 Where 專業(yè) like * & mzy & * Data1.Refresh If Data1.Recordset.Eof Then MsgBox 無此專業(yè)!, , 提示 Data1.RecordSource = 基本情況 Data1.Refresh End IfEnd Sub 65例9.9 用SQL語句從student.mdb數(shù)據(jù)庫的兩個數(shù)據(jù)表中選擇數(shù)據(jù)構(gòu)成記錄集,并通過數(shù)據(jù)控件瀏覽記錄集。 Private Sub Form_Load

51、( ) Data1.RecordSource = Select 基本情況.學(xué)號,基本情況.姓名,基本情況.照片,學(xué)生成績表.課程,學(xué)生成績表.成績 From 學(xué)生成績表,基本情況 Where 學(xué)生成績表.學(xué)號=基本情況.學(xué)號End Sub注意:當(dāng)From子句列出多個表時,它們出現(xiàn)的順序并不重要。Select短語中字段的排列決定了所產(chǎn)生的記錄集內(nèi)每一列數(shù)據(jù)的排列順序。為了提高可讀性可以重新排序表中的字段。 66例9.10 用SQL指令按專業(yè)統(tǒng)計student.mdb數(shù)據(jù)庫中各專業(yè)的人數(shù),要求按圖9-19所示形式輸出 在窗體上放置一個Data控件和一個網(wǎng)格控件MSFlexGrid1。Data1的D

52、atabaseName屬性指定數(shù)據(jù)庫student.mdb,網(wǎng)格控件的DataSource=Data1。圖9-19 通過數(shù)據(jù)控件瀏覽記錄集 67“按專業(yè)統(tǒng)計人數(shù)”按鈕的指令代碼為:Private Sub Command1_Click( ) Data1.RecordSource = Select 專業(yè),Count(*) As 人數(shù) From 基本情況 Group By 專業(yè) Data1.RefreshEnd Sub圖圖9-20 運行結(jié)果運行結(jié)果 68按平均成績統(tǒng)計前5名”按鈕的指令代碼為:Private Sub Command2_Click( ) Data1.RecordSource = Sel

53、ect Top 5 學(xué)號,Avg(成績) As 平均成績 From 學(xué)生成績表 Group By 學(xué)號 Order By Avg(成績) Desc Data1.RefreshEnd Sub“恢復(fù)原表內(nèi)容”按鈕的指令代碼為:Private Sub Command3_Click( ) Data1.RecordSource = 基本情況 Data1.RefreshEnd Sub 69例9.11 將例9.9中的Data控件改用ADO數(shù)據(jù)控件,用SQL語句從student.mdb數(shù)據(jù)庫的兩個數(shù)據(jù)表中選擇數(shù)據(jù)構(gòu)成記錄集 將Data控件改用ADO數(shù)據(jù)控件Adodc1,各文本框的Datasource=Adod

54、c1,DataField屬性分別設(shè)置為學(xué)號、姓名、課程、成績,而字段照片綁定圖形框。 圖9-21 使用ADO數(shù)據(jù)控件 70即DataSource屬性使用SQL語句:select 學(xué)生成績表.*,基本情況.姓名,基本情況.照片 from 學(xué)生成績表,基本情況 where 學(xué)生成績表.學(xué)號=基本情況.學(xué)號例9.12 設(shè)計一個窗體,計算student.mdb數(shù)據(jù)庫內(nèi)學(xué)生成績表中每個學(xué)生的平均成績,產(chǎn)生姓名、平均成績和最低成績?nèi)棓?shù)據(jù),按平均成績降序排列數(shù)據(jù),并用該數(shù)據(jù)作圖。 要顯示作圖數(shù)據(jù),可在窗體上放置一個網(wǎng)格控件,選擇“工程”“部件”中的Microsoft Data Grid Control 6

55、.0 (OLEDB),設(shè)置網(wǎng)格的DataSource=Adodcl,將其綁定到ADO數(shù)據(jù)控件上。此例將Adodc1控件的Visible屬性設(shè)為False,故在圖9-21中看不到Adodc1控件。要繪制圖表,可使用綁定控件MsChart。MsChart控件也是一個Active X控件,需要通過“工程”“部件”命令,將MsChart控件添加到工具箱中。要將作圖數(shù)據(jù)傳送到Mschart控件,只需要設(shè)置MsChart1.DataSource=Adodc1。如果只要選擇部分數(shù)據(jù)作圖,可以將作圖數(shù)據(jù)存入數(shù)組,再設(shè)置MsChart1.Data=數(shù)組名即可。 71將Adodcl的RecordSource屬性設(shè)置為SQL語句,代碼如下:Select 基本情況.姓名,Avg(成績) As 平均成績,Min(成績) As 最低成績 From 學(xué)生成績表,基本情況Where 學(xué)生成績表.學(xué)號=基本情況.學(xué)號Group By學(xué)生成績表.學(xué)號,基本情況.姓名 Order By Avg(成績)

溫馨提示

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

評論

0/150

提交評論