VB數(shù)據(jù)庫(kù)編程技術(shù).ppt_第1頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù).ppt_第2頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù).ppt_第3頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù).ppt_第4頁(yè)
VB數(shù)據(jù)庫(kù)編程技術(shù).ppt_第5頁(yè)
已閱讀5頁(yè),還剩80頁(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、第6章 VB數(shù)據(jù)庫(kù)編程技術(shù),61 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),62 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),63 數(shù)據(jù)控件,64 ODBC,65 ADO數(shù)據(jù)控件,66 VB中SQL的實(shí)現(xiàn),67 VB中使用ODBC,68 網(wǎng)絡(luò)數(shù)據(jù)庫(kù)設(shè)計(jì),1. VB中的數(shù)據(jù)訪(fǎng)問(wèn) VB提供的數(shù)據(jù)庫(kù)引擎叫Jet。 VB提供了兩種與Jet數(shù)據(jù)庫(kù)引擎接口的方法: Data控件(Data Control)和數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象(DAO)。這兩種方法可以同時(shí)使用。,6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),Data控件提供了有限的 不需編程就能訪(fǎng)問(wèn)現(xiàn)存 數(shù)據(jù)庫(kù)的功能,DAO模型是全面控制 數(shù)據(jù)庫(kù)的完整編程接口,VB通過(guò)DAO、ADO和Jet引擎可以識(shí)別三類(lèi)數(shù)據(jù)庫(kù): (1

2、)VB數(shù)據(jù)庫(kù) 也稱(chēng)本地?cái)?shù)據(jù)庫(kù),本地?cái)?shù)據(jù)庫(kù)文件格式與Microsoft Access相同。Jet引擎直接創(chuàng)建和操作這些數(shù)據(jù)庫(kù)。 (2)外部數(shù)據(jù)庫(kù) 訪(fǎng)問(wèn)符合“索引順序訪(fǎng)問(wèn)文件方法(ISAM)”數(shù)據(jù)庫(kù),包括:dBase III、dBase IV、Foxpro 2.0和2.5以及Paradox 3.x和4.x。 (3)ODBC數(shù)據(jù)庫(kù) 訪(fǎng)問(wèn)符合ODBC標(biāo)準(zhǔn)的客戶(hù)機(jī)服務(wù)器數(shù)據(jù)庫(kù),如Microsoft SQL Server。,6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),2 . VB數(shù)據(jù)庫(kù)體系結(jié)構(gòu) Jet引擎負(fù)責(zé)處理存儲(chǔ)、檢索、更新數(shù)據(jù)的結(jié)構(gòu),并提供了功能強(qiáng)大的面向?qū)ο蟮腄AO編程接口。 (1) VB數(shù)據(jù)庫(kù)應(yīng)用程序的組成 VB數(shù)

3、據(jù)庫(kù)應(yīng)用程序包含三部分,如圖6.1所示。,圖6.1 VB數(shù)據(jù)庫(kù)應(yīng)用程序的組成,6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),用戶(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ù)訪(fǎng)問(wèn)對(duì)象和方法,比如添加或刪除記錄,或執(zhí)行查詢(xún)等。,6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),Jet引擎 Jet引擎實(shí)際是一組動(dòng)態(tài)鏈接庫(kù)(DLL)文件。在運(yùn)行時(shí),這些文件被鏈接到VB程序。它把應(yīng)用程序的請(qǐng)求翻譯成.mdb(Access文件后綴)文件或其他數(shù)據(jù)庫(kù)的物理操作。 Jet引擎真正讀取、寫(xiě)入和修改數(shù)據(jù)庫(kù),并處理所有內(nèi)部事務(wù),如索引、鎖定

4、、安全性和引用完整性。 Jet引擎包含一個(gè)查詢(xún)處理器,接收并執(zhí)行SQL查詢(xún),實(shí)現(xiàn)所需的數(shù)據(jù)操作。 Jet引擎包含一個(gè)結(jié)果處理器,用來(lái)管理查詢(xún)所返回的結(jié)果。,6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)是包含數(shù)據(jù)庫(kù)表的一個(gè)或多個(gè)文件。 本地VB或Access數(shù)據(jù)庫(kù)文件后綴為mdb文件。 (2)數(shù)據(jù)庫(kù)應(yīng)用程序的存放 在單系統(tǒng)機(jī)中數(shù)據(jù)庫(kù)、數(shù)據(jù)引擎和用戶(hù)界面集中存放。 在客戶(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)求的記錄。,6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),6.1 數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ),服務(wù)器,客戶(hù)機(jī),客戶(hù)機(jī)服務(wù)器引

5、擎,通過(guò)ODBC方式使用。在VB中,通過(guò)連接到ODBC數(shù)據(jù)源,如Microsoft SQL Server等,可直接把查詢(xún)傳遞給服務(wù)器數(shù)據(jù)庫(kù)引擎。,VB中創(chuàng)建和訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的途徑主要有3個(gè): 可視化數(shù)據(jù)管理器 使用可視化數(shù)據(jù)管理器,不需要編程就可以創(chuàng)建Jet數(shù)據(jù)庫(kù)。 DAO 使用VB的DAO部件通過(guò)編程的方法創(chuàng)建數(shù)據(jù)庫(kù)。 ISAM或ODBC VB可通過(guò)ISAM或ODBC驅(qū)動(dòng)程序來(lái)訪(fǎng)問(wèn)外部數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)。,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),1可視化數(shù)據(jù)管理器 數(shù)據(jù)管理器(Data Manager)是VB的一個(gè)傳統(tǒng)成員,它可以用于快速地建立數(shù)據(jù)庫(kù)結(jié)構(gòu)及數(shù)據(jù)庫(kù)內(nèi)容。 可以完成有關(guān)數(shù)據(jù)庫(kù)的操作,比如數(shù)

6、據(jù)庫(kù)結(jié)構(gòu)的建立、記錄的添加及修改以及用ODBC連接到服務(wù)器端的數(shù)據(jù)庫(kù)如SQL Server等。 啟動(dòng)數(shù)據(jù)管理器 選擇“外接程序”菜單下的“可視化數(shù)據(jù)管理器”項(xiàng)就可以啟動(dòng)數(shù)據(jù)管理器,打開(kāi)“VisData”窗口。,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),2)工具欄按鈕,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),數(shù)據(jù)庫(kù)窗口,SQL語(yǔ)句窗口,顯示數(shù)據(jù)庫(kù)的結(jié)構(gòu),包括表名、列名、索引,可輸入SQL命令,對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行查詢(xún)操作,VisData窗口,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),設(shè)置記錄集的訪(fǎng)問(wèn)方式,指定數(shù)據(jù)表中數(shù)據(jù)的顯示方式,進(jìn)行事務(wù)處理,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),表類(lèi)型記錄集按鈕

7、,允許直接對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行增、刪、改、查等操作。,動(dòng)態(tài)集類(lèi)型記錄集按鈕,將指定的數(shù)據(jù)打開(kāi)并讀入到內(nèi)存中,進(jìn)行數(shù)據(jù)編輯操作。,快照類(lèi)型記錄集,只能讀數(shù)據(jù)不能修改,適用于只查詢(xún)的情況,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),指定數(shù)據(jù)表中數(shù)據(jù)的顯示方式,在新窗體上使用DATA控件,指定數(shù)據(jù)表中數(shù)據(jù)的顯示方式,在新窗體上不使用DATA控件,指定數(shù)據(jù)表中數(shù)據(jù)的顯示方式,在新窗體上使用DBGrid控件,進(jìn)入,2具體實(shí)現(xiàn) 1)建立數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)student.mdb(學(xué)生數(shù)據(jù)庫(kù))中的表定義: 學(xué)生成績(jī)表(學(xué)號(hào),課程,成績(jī),學(xué)期)。,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),基本情況表(學(xué)號(hào),姓名,性別,專(zhuān)

8、業(yè),出生年月,照片,備注),6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),學(xué)生基本情況表結(jié)構(gòu) 字段名 類(lèi)型 寬度 學(xué)號(hào) Text 6 姓名 Text 10 性別 Text 2 專(zhuān)業(yè) Text 10 出生年月 Date 8 照片 Binary 0 備注 Memo 0,添加數(shù)據(jù)表 建立索引 建立索引可以加快檢索速度。 2)錄入數(shù)據(jù) 照片的輸入: 靜態(tài)設(shè)置:通過(guò)一個(gè)圖片編輯程序?qū)⒄掌b入剪貼板,等待從剪貼板復(fù)制到Picture1控件。,6.3.1 數(shù)據(jù)控件屬性,動(dòng)態(tài)設(shè)置:通過(guò)Picture1_DblClick事件來(lái)完成剪貼板到Picture1控件的復(fù)制,當(dāng)移動(dòng)記錄指針時(shí),Picture1控件內(nèi)的照片存入數(shù)

9、據(jù)庫(kù)。 Private Sub Picture1_DblClick() Picture1.Picture = Clipboard.GetData End Sub 3)建立查詢(xún) VB的數(shù)據(jù)管理器提供了一個(gè)圖形化的設(shè)置查詢(xún)條件的窗口查詢(xún)生成器。 例如:查詢(xún)Authors ID=10或Authors ID=1的情況,6.2 本地?cái)?shù)據(jù)庫(kù)設(shè)計(jì)(ACCESS),進(jìn)入,Data控件數(shù)據(jù)控件提供有限的不需編程而能訪(fǎng)問(wèn)現(xiàn)存數(shù)據(jù)庫(kù)的功能,允許將Visual Basic的窗體與數(shù)據(jù)庫(kù)方便地進(jìn)行連接。 使用數(shù)據(jù)控件獲取數(shù)據(jù)庫(kù)中記錄的集合,先在窗體上畫(huà)出控件,再通過(guò)它的三個(gè)基本屬性Connect、DatabaseNam

10、e和RecordSource設(shè)置要訪(fǎng)問(wèn)的數(shù)據(jù)資源。,6.3 數(shù)據(jù)控件,1Connect屬性 Connect屬性指定數(shù)據(jù)控件所要連接的數(shù)據(jù)庫(kù)類(lèi)型,Visual Basic默認(rèn)的數(shù)據(jù)庫(kù)是Access的MDB文件,也可連接ODBC等類(lèi)型的數(shù)據(jù)庫(kù)。 Access數(shù)據(jù)庫(kù)的所有表都包含在一個(gè)MDB文件中。,6.3.1 數(shù)據(jù)控件屬性,2DatabaseName屬性 DatabaseName屬性指定具體使用的數(shù)據(jù)庫(kù)文件名,包括文件所在的路徑名。 數(shù)據(jù)庫(kù)中的基本表名可由RecordSource屬性指定。 例如,要連接一個(gè)Microsoft Access的數(shù)據(jù)庫(kù)存放在C:Student.mdb. 設(shè)置Databa

11、seName=”C:Student.mdb“,該方法可以通過(guò)屬性欄設(shè)置,或在過(guò)程中指定. 在過(guò)程中可以使用相對(duì)路徑來(lái)描述, DatabaseName=”.Student.mdb“。,6.3.1 數(shù)據(jù)控件屬性,3RecordSource屬性 RecordSource確定具體可訪(fǎng)問(wèn)的記錄集對(duì)象Recordset。 該屬性值可以是數(shù)據(jù)庫(kù)中的單個(gè)表名或者是使用SQL查詢(xún)語(yǔ)言的一個(gè)查詢(xún)。 例如,指定Student.mdb數(shù)據(jù)庫(kù)中的基本情況表: RecordSource=”基本情況”。 例如,訪(fǎng)問(wèn)基本情況表中所有物理系學(xué)生的數(shù)據(jù)。 RecordSource=”Select From 基本情況 Where專(zhuān)

12、業(yè)=物理 ”,,6.3.1 數(shù)據(jù)控件屬性,4RecordsetType屬性 RecordsetType屬性確定記錄集類(lèi)型。 (1)Table: 表記錄集類(lèi)型,一個(gè)記錄集(單個(gè)表) (2)Dynaset: 動(dòng)態(tài)集類(lèi)型,一個(gè)動(dòng)態(tài)記錄集(多個(gè)表),默認(rèn)值。 (3)Snapshot:快照類(lèi)型,一個(gè)記錄集靜態(tài)副本(不可改) 5EofAction和BofAction屬性 當(dāng)記錄指針指向Recordset對(duì)象的開(kāi)始(第一個(gè)記錄前)或結(jié)束(最后一個(gè)記錄后)時(shí),BofAction和EofAction屬性的設(shè)置或返回值決定了數(shù)據(jù)控件要采取的操作。操作屬性的取值如表6.1所示。,6.3.1 數(shù)據(jù)控件屬性,6.3.1

13、 數(shù)據(jù)控件屬性,焦點(diǎn)將從一個(gè)記錄轉(zhuǎn)換到另一 個(gè)記錄之前,Validate 事件發(fā)生,6.3.1 數(shù)據(jù)控件屬性,與數(shù)據(jù)控件綁定: 數(shù)據(jù)控件本身不能直接顯示記錄集中的數(shù)據(jù),必須通過(guò)能與它綁定的控件來(lái)實(shí)現(xiàn)??膳c數(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è)置: DataSource屬性 該屬性通過(guò)指定個(gè)有效的數(shù)據(jù)控件連接到一個(gè)數(shù)據(jù)庫(kù)上。 DataField屬性 該屬性設(shè)置數(shù)據(jù)庫(kù)有效的字段與綁定控件建立聯(lián)系。,6.3.1 數(shù)據(jù)控件屬性,當(dāng)上

14、述控件與數(shù)據(jù)控件綁定后,Visual Basic將當(dāng)前記錄的字段值賦給控件。 數(shù)據(jù)控件在裝入數(shù)據(jù)庫(kù)時(shí),它把記錄集的第一個(gè)記錄作為當(dāng)前記錄。當(dāng)數(shù)據(jù)控件的EofAction屬性值設(shè)置為2時(shí),當(dāng)記錄指針移過(guò)記錄集結(jié)束位,數(shù)據(jù)控件會(huì)自動(dòng)向記錄集加入新的空記錄。,綁定控件、數(shù)據(jù)控件和數(shù)據(jù)庫(kù)三者的關(guān)系如圖下示。,6.3.1 數(shù)據(jù)控件屬性,例6.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ù)。,6.3.1 數(shù)據(jù)控件屬性,進(jìn)入,數(shù)據(jù)控件Data1屬

15、性設(shè)置 Connect屬性指定為Access類(lèi)型 DatabaseName屬性連接數(shù)據(jù)庫(kù)Student.mdb RecordSource屬性設(shè)置為“基本情況”表。 圖片框和5個(gè)文本框控件屬性設(shè)置 Text1Text5的DataSource屬性設(shè)置成Data1。 Text1Text5的DataField屬性分別選擇與其對(duì)應(yīng)的字段學(xué)號(hào)、姓名、性別、專(zhuān)業(yè)和出生年月。 Picture1的DataField屬性選擇字段照片,6.3.1 數(shù)據(jù)控件屬性,進(jìn)入,例6.3 用數(shù)據(jù)網(wǎng)格控件MsFlexGrid顯示Student.mdb數(shù)據(jù)庫(kù)中基本情況表的內(nèi)容。,6.3.1 數(shù)據(jù)控件屬性,進(jìn)入,數(shù)據(jù)網(wǎng)格控件的Dat

16、aSource屬性設(shè)置為一個(gè)Data控件,運(yùn)行時(shí)網(wǎng)格控件的列標(biāo)題會(huì)用Data控件的記錄集里的數(shù)據(jù)自動(dòng)地設(shè)置。 MsFlexGrid控件不是Visual Basic工具箱內(nèi)的默認(rèn)控件,需要在開(kāi)發(fā)環(huán)境中選擇“工程|部件”菜單命令,并在隨即出現(xiàn)的對(duì)話(huà)框中選擇“Microsoft FlexGrid Control 6.0”選項(xiàng),將其添加到工具箱中。,6.3.1 數(shù)據(jù)控件屬性,本例所用控件的屬性設(shè)置如下表所示。,6.3.1 數(shù)據(jù)控件屬性,注意:不可卷動(dòng)列屬性FixedCols=0與FixedCols=1的區(qū)別,進(jìn)入,1Reposition事件 Reposition事件激活的條件:當(dāng)記錄集指針從一條記錄移

17、到另一條記錄,會(huì)產(chǎn)生Reposition事件。 Reposition事件作用:顯示當(dāng)前指針的位置。,6.3.2 數(shù)據(jù)控件的事件和常用方法,Private Sub Data1_Reposition() Data1.Caption = Data1.Recordset.AbsolutePosition + 1 End Sub,AbsolutePosition屬性指示當(dāng)前指針值(從0開(kāi)始)。當(dāng)單擊數(shù)據(jù)控件對(duì)象上的箭頭按鈕時(shí),數(shù)據(jù)控件的標(biāo)題區(qū)會(huì)顯示記錄的序號(hào),2.Validate事件 Validate事件激活的方法:在焦點(diǎn)轉(zhuǎn)換到一個(gè)(第二個(gè))控件之前發(fā)生,此時(shí)該控件CausesValidation 屬性

18、值設(shè)置為T(mén)rue。 Validate事件的作用:用于檢查被數(shù)據(jù)控件綁定控件的狀態(tài),例如,由一個(gè)記錄移到另一個(gè)記錄;或者焦點(diǎn)由一個(gè)文本框移到另一個(gè)文本框.,6.3.2 數(shù)據(jù)控件的事件和常用方法,6.3.2 數(shù)據(jù)控件的事件和常用方法,例題:在窗體中放置一個(gè)CommandButton 和兩個(gè)TextBox 控件,來(lái)演示Validate 事件和CausesValidation 屬性的使用。 限制條件為:如果 Text1沒(méi)有包含日期或 Text2沒(méi)有包含一個(gè)大于10的數(shù)字,將阻止焦點(diǎn)的轉(zhuǎn)換。 兩個(gè)TextBox 控件的CausesValidatio n屬性在缺省情況為 True,這樣當(dāng)把焦點(diǎn)從一個(gè)Tex

19、tBox轉(zhuǎn)換到另一個(gè)時(shí),Validate 事件發(fā)生。,進(jìn)入,6.3.2 數(shù)據(jù)控件的事件和常用方法,Private Sub Form_Load() With Command1 .CausesValidation = False 設(shè)置該屬性為False,當(dāng)用戶(hù)單擊按鈕時(shí),Validate事件不發(fā)生。 .Caption = Help End With Show With Text1 選擇Text1的文本并為它設(shè)置焦點(diǎn)。 .SelLength = Len(Text1.Text) .SetFocus End With End Sub,With 語(yǔ)句可以對(duì)某個(gè)對(duì)象執(zhí)行一系列的語(yǔ)句,而不用重復(fù)指出對(duì)象的名稱(chēng)

20、。例如,要改變一個(gè)對(duì)象的多個(gè)屬性,可以在 With 控制結(jié)構(gòu)中加上屬性的賦值語(yǔ)句,這時(shí)候只是引用對(duì)象一次而不是在每個(gè)屬性賦值時(shí)都要引用它。,返回或設(shè)置所選擇的字符數(shù),6.3.2 數(shù)據(jù)控件的事件和常用方法,Private Sub Command1_Click() 當(dāng)單擊此按鈕時(shí)給出用戶(hù)幫助信息。 MsgBox _ Text1 must be set to a date. & VbCrLF & _ Text2 must be a number less than 10.“ End Sub,回車(chē)換行,6.3.2 數(shù)據(jù)控件的事件和常用方法,Private Sub Text1_Validate(Keep

21、Focus As Boolean) 如果值不是一個(gè)日期,則保持焦點(diǎn),除非用戶(hù)單擊Help。 If Not IsDate(Text1.Text) Then KeepFocus = True MsgBox Please insert a date in this field., , Text1 End if End Sub,返回 Boolean 值指明某表達(dá)式是否可以轉(zhuǎn)換為日期。,6.3.2 數(shù)據(jù)控件的事件和常用方法,Private Sub Text2_Validate(KeepFocus As Boolean) 如果值是一個(gè)大于10的數(shù)字,保持焦點(diǎn)。 If Not IsNumeric(Text2

22、.Text) Or Val(Text2.Text) 10 Then KeepFocus = True MsgBox _Please insert a number less than or equal to 10., , Text2 End If End Sub,返回 Boolean 值指明表達(dá)式的值是否為數(shù)字。,進(jìn)入,6.3.2 數(shù)據(jù)控件的事件和常用方法,Validate事件的檢查方法: 通過(guò)Save參數(shù)(True或False)判斷被連接的數(shù)據(jù)(被綁定的控件) 是否發(fā)生變化。 通過(guò)Action參數(shù)判斷哪一種操作觸發(fā)了Validate事件。,6.3.2 數(shù)據(jù)控件的事件和常用方法,6.3.2 數(shù)

23、據(jù)控件的事件和常用方法,保存對(duì) Recorded 對(duì)象的當(dāng)前記錄所做的所有更改。,例如,不允許用戶(hù)在數(shù)據(jù)瀏覽時(shí)清空性別數(shù)據(jù),可使用下列代碼:,6.3.2 數(shù)據(jù)控件的事件和常用方法,Private Sub Data1_Validate(Action As Integer,_ Save As Integer) If Save And Len(Trim(Text3.Text) = 0 Then Action = 0 取消操作 MsgBox 性別不能為空! End If End Sub,檢查被數(shù)據(jù)控件綁定的控件Text3內(nèi)的數(shù)據(jù)是否被清空。如果Text3內(nèi)的數(shù)據(jù)發(fā)生變化,則Save參數(shù)返回True,若

24、性別對(duì)應(yīng)的文本框Text3被置空,則通過(guò)Action=0取消對(duì)數(shù)據(jù)控件的操作,去除前導(dǎo)空格和末尾空格,3 數(shù)據(jù)控件的常用方法 數(shù)據(jù)控件的內(nèi)置功能很多,可以在代碼中用數(shù)據(jù)控件的方法訪(fǎng)問(wèn)這些屬性。 1)Refresh方法 當(dāng)RecordSource在運(yùn)行時(shí)被改變時(shí),使用Refresh方法,將當(dāng)前指定RecordSource中的數(shù)據(jù)裝入內(nèi)存工作區(qū),達(dá)到激活數(shù)據(jù)庫(kù)的作用。,6.3.2 數(shù)據(jù)控件的事件和常用方法,6.3.2 數(shù)據(jù)控件的事件和常用方法,Private Sub Form_Load( ) Dim Mpath As String Mpath=App.Path 獲取當(dāng)前路徑 If Right(mp

25、ath,1)”/” Then mpath=mpath+”/” Data1.DatabaseName=mpath+”Student.mdb” 連接數(shù)據(jù)庫(kù) Data1.RecordSource= 基本情況” 構(gòu)成記錄集對(duì)象 Data1.Refresh 激活數(shù)據(jù)控件 End Sub,App 對(duì)象是通過(guò)關(guān)鍵字 App 訪(fǎng)問(wèn)的全局對(duì)象。它指定如下信息:應(yīng)用程序的標(biāo)題、版本信息、可執(zhí)行文件的路徑及名稱(chēng)以及是否運(yùn)行前一個(gè)應(yīng)用程序的示例。 Path返回或設(shè)置當(dāng)前路徑,在編程時(shí)無(wú)效,運(yùn)行時(shí)有效。,RIGHT(cExpression, nCharacters) Function返回從右邊數(shù)的n個(gè)字符。,2)Upd

26、ateControls方法 UpdateControls方法從數(shù)據(jù)庫(kù)中重新讀數(shù)據(jù)送到被數(shù)據(jù)控件綁定的控件內(nèi)。,6.3.2 數(shù)據(jù)控件的事件和常用方法,3)UpdateRecord方法 對(duì)綁定控件內(nèi)的數(shù)據(jù)修改后,數(shù)據(jù)控件需要移動(dòng)記錄集的指針才能保存修改。如果使用UpdateRecord方法,可強(qiáng)制數(shù)據(jù)控件將綁定控件內(nèi)的數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)中,而不再觸發(fā)Validate事件。,記錄集Recordset常用的屬性和方法。 1AbsolutePosition屬性 AbsolutePosition返回當(dāng)前指針值,如果是第1條記錄,其值為0,該屬性為只讀屬性。 2Bof和Eof的屬性 Bof判定記錄指針是否在首

27、記錄之前,若Bof為T(mén)rue,則當(dāng)前位置位于記錄集的第1條記錄之前。 Eof判定記錄指針是否在末記錄之后,若Eof為T(mén)rue,則當(dāng)前位置位于記錄集的最后1條記錄之后。,6.3.3 記錄集的屬性和方法,6.3.2 數(shù)據(jù)控件的事件和常用方法,3Bookmark屬性 Bookmark屬性的值采用字符串類(lèi)型,用于設(shè)置或返回當(dāng)前指針的標(biāo)簽。在程序中可以使用Bookmark屬性重定位記錄集的指針。 4Nomatch屬性 在記錄集中進(jìn)行查找時(shí),如果找到相匹配的記錄,則Recordset的NoMatch屬性為False,否則為T(mén)rue。該屬性常與Bookmark屬性一起使用。 5RecordCount屬性 R

28、ecordCount屬性對(duì)Recordset對(duì)象中的記錄計(jì)數(shù),使用 RecordCount 屬性可確定 Recordset 對(duì)象中記錄的數(shù)目。,6.3.3 記錄集的屬性和方法,6Move方法 五種Move方法是: MoveFirst 將控件移動(dòng)到第1條記錄。 MoveLast 將控件移動(dòng)到最后一條記錄。 MoveNext 將控件移動(dòng)到后一條記錄。 MovePrevious 將控件移動(dòng)到前一條記錄。 Move n 向前或向后移n條記錄,n為指定的數(shù)值。,6.3.3 記錄集的屬性和方法,例6.4 設(shè)計(jì)一個(gè)窗體用以顯示建立的student.mdb數(shù)據(jù)庫(kù)中基本情況表的內(nèi)容。在窗體上用4個(gè)命令按鈕實(shí)現(xiàn)對(duì)

29、數(shù)據(jù)庫(kù)的操作。,圖6.10 用按鈕代替數(shù)據(jù)控件對(duì)象的箭頭按鈕,6.3.3 記錄集的屬性和方法,命令按鈕Command1_Click事件移至第1條記錄,代碼如下:,6.3.3 記錄集的屬性和方法,命令按鈕Command4_Click事件移至最后一條記錄,代碼如下:,Private Sub Command4_Click() Data1.Recordset.MoveLast End Sub,Private Sub Command1_Click() Data1.Recordset.MoveFirst End Sub,使用Move方法需要考慮Recordset對(duì)象的邊界狀態(tài)。如果越界,則用MoveFir

30、st方法定位到第1條記錄或用MoveLast方法定位到最后一條記錄。 使用MoveFirst方法定位到第1條記錄:,6.3.3 記錄集的屬性和方法,Private Sub Command2_Click() Data1.Recordset.MovePrevious If Data1.Recordset.BOF Then Data1.Recordset.MoveFirst End Sub,使用MoveLast方法定位到最后一條記錄:,6.3.3 記錄集的屬性和方法,Private Sub Command3_Click() Data1.Recordset.MoveNext If Data1.Reco

31、rdset.EOF Then Data1.Recordset.MoveLast End Sub,7Find方法 使用Find方法可在Recordset對(duì)象中查找與指定條件相符的一條記錄,并使之成為當(dāng)前記錄。 四種Find方法是: FindFirst方法 從記錄集的開(kāi)始查找滿(mǎn)足條件的第1條記錄。 FindLast方法 從記錄集的尾部向前查找滿(mǎn)足條件的第l條記錄。 FindNext方法 從當(dāng)前記錄開(kāi)始查找滿(mǎn)足條件的下一條記錄。 FindPrevious方法 從當(dāng)前記錄開(kāi)始查找滿(mǎn)足條件的上一條記錄。,6.3.3 記錄集的屬性和方法,Find方法的語(yǔ)法格式:4種格式相同 數(shù)據(jù)集.Find方法 條件 搜

32、索條件表達(dá)式:是一個(gè)指定字段與常量關(guān)系的字符串表達(dá)式。在構(gòu)造表達(dá)式時(shí),除了用普通的關(guān)系運(yùn)算外,還可以用Like運(yùn)算符。 例如,查找專(zhuān)業(yè)=物理的紀(jì)錄 “Data1.Recordset.FindFirst 專(zhuān)業(yè)=物理” 查找下一條符合條件的記錄,可繼續(xù)使用語(yǔ)句: ”Data1.Recordset.FindNext 專(zhuān)業(yè)=物理”。,6.3.3 記錄集的屬性和方法,例如,要在記錄集內(nèi)查找專(zhuān)業(yè)名稱(chēng)中帶有“建”字的專(zhuān)業(yè): Data1.Recordset.FindFirst 專(zhuān)業(yè) Like %建% 如果Find方法找不到相匹配的記錄,則記錄保持在查找的始發(fā)處,Recordset的NoMatch屬性為T(mén)rue

33、。 如果Find方法找到相匹配的記錄,則記錄定位到該記錄,Recordset的NoMatch屬性為False。,6.3.3 記錄集的屬性和方法,6.3.3 記錄集的屬性和方法,Private Sub Command1_Click() Data1.Recordset.FindFirst”course”=English“ If Data1.Recordset.NoMatch Then MsgBox ”No such record found” Else MsgBox Data1.Recordset.Fields(“course” ) End If End Sub,8Seek方法 Seek方法:是根

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

35、記錄集的屬性和方法,Data1.RecordsetType = 1 設(shè)置記錄集類(lèi)型為T(mén)able Data1.RecordSource = “基本情況” 打開(kāi)基本情況表單 Data1.Refresh Data1.Recordset.Index = jbqk_no 打開(kāi)名稱(chēng)為jbqk_no的索引 Data1.Recordset.Seek =, 110001,數(shù)據(jù)庫(kù)記錄的增、刪、改操作需要使用AddNew、Delete、Edit、Update和Refresh方法。 它們的語(yǔ)法格式為: 數(shù)據(jù)控件.記錄集.方法名 1增加記錄 調(diào)用AddNew方法。 給各字段賦值。給字段賦值格式為: Recordset.

36、Fields(”字段名”)=值。,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,調(diào)用Update方法,將緩沖區(qū)內(nèi)的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)。 如果使用AddNew方法添加新的記錄,但是沒(méi)有使用Update方法而移動(dòng)到其他記錄,或者關(guān)閉記錄集,那么所做的輸入將全部丟失,而且沒(méi)有任何警告。 當(dāng)調(diào)用Update方法寫(xiě)入記錄后,記錄指針自動(dòng)返回到添加新記錄前的位置上,而不顯示新記錄。因此,需要在調(diào)用Update方法后,使用MoveLast方法將記錄指針再次移到新記錄上。,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,2刪除記錄 定位被刪除的記錄使之成為當(dāng)前記錄。 調(diào)用Delete方法。 移動(dòng)記錄指針。 在使用Delete方法時(shí),當(dāng)

37、前記錄立即刪除,不加任何的警告或者提示。 刪除一條記錄后,被數(shù)據(jù)庫(kù)所約束的綁定控件仍舊顯示該記錄的內(nèi)容。因此,必須移動(dòng)記錄指針?biāo)⑿陆壎丶?,一般采用移至下一記錄的處理方法?在移動(dòng)記錄指針后,應(yīng)該檢查Eof屬性,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,3編輯記錄 數(shù)據(jù)控件自動(dòng)提供了修改現(xiàn)有記錄的能力,當(dāng)直接改變被數(shù)據(jù)庫(kù)所約束的綁定控件的內(nèi)容后,需單擊數(shù)據(jù)控件對(duì)象的任一箭頭按鈕來(lái)改變當(dāng)前記錄,確定所做的修改。 使用程序代碼修改當(dāng)前記錄步驟的為: 調(diào)用Edit方法。 給各字段賦值。 調(diào)用Update方法,確定所做的修改。 如果要放棄對(duì)數(shù)據(jù)的所有修改,可用updatecontrols方法,重讀數(shù)據(jù)庫(kù)的數(shù)

38、據(jù),沒(méi)有調(diào)用Update方法,數(shù)據(jù)的修改沒(méi)有寫(xiě)入數(shù)據(jù)庫(kù),所以這樣的記錄會(huì)在刷新記錄集時(shí)丟失。,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,圖6.11 編程建立增、刪、改、查功能,例6.5 設(shè)計(jì)一個(gè)窗體用以顯示建立的student.mdb數(shù)據(jù)庫(kù)中基本情況表的內(nèi)容。并加入“新增”、“刪除”、“修改”、“放棄”和“查找”鈕,通過(guò)對(duì)5個(gè)按紐的編程建立增、刪、改、查功能。,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,進(jìn)入,Command1_Click事件的功能: 當(dāng)按鈕提示為“新增”時(shí)調(diào)用AddNew方法,并將提示文字改為“確認(rèn)”,同時(shí)使“刪除”按鈕Command2、“修改”按鈕Command3和“查找”按鈕Comma

39、nd5不可用,而使“放棄”按鈕Command4可用。 新增記錄后,需再次單擊Command1調(diào)用Update方法確認(rèn)添加的記錄,再將提示文字改為“新增”,并使“刪除”、“修改”和“查找”按鈕可用,而使“放棄”按鈕不可用。 On Error Resume Next語(yǔ)句表示在程序運(yùn)行時(shí)發(fā)生錯(cuò)誤,忽略錯(cuò)誤行,繼續(xù)執(zhí)行下一語(yǔ)句。,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,Private Sub Command1_Click() On Error Resume Next。 Command2.Enabled = Not Command2.Enabled Command3.En

40、abled = Not Command3.Enabled Command4.Enabled = Not Command4.Enabled Command5.Enabled = Not Command5.Enabled,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,If Command1.Caption = 新增 Then Command1.Caption = “確認(rèn)” Data1.Recordset.AddNew Text1.SetFocus Else Command1.Caption = 新增 Data1.Recordset.Update Data1.Recordset.MoveLast End If

41、 End Sub,命令按鈕Command2_Click事件功能: 調(diào)用方法刪除當(dāng)前記錄。當(dāng)記錄集中的記錄全部被刪除后,再執(zhí)行Move語(yǔ)句將發(fā)生錯(cuò)誤,這時(shí)由On Error Resume Next語(yǔ)句處理錯(cuò)誤。,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,Private Sub Command2_Click() On Error Resume Next Data1.Recordset.Delete Data1.Recordset.MoveNext If Data1.Recordset.EOF Then Data1.Recordset.MoveLast End Sub,命令按鈕Command3_Click

42、事件的功能: 根據(jù)按鈕提示文字調(diào)用Edit方法進(jìn)入編輯狀態(tài)或調(diào)用Update方法將修改后的數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù),并控制其他3個(gè)按鈕的可用性,代碼如下:,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,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.Enable

43、d,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,If Command3.Caption = 修改 Then Command3.Caption = 確認(rèn) Data1.Recordset.Edit Text1.SetFocus Else Command3.Caption = 修改 Data1.Recordset.Update End If End Sub,命令按鈕Command4_Click事件的功能: 使用UpdateControls方法放棄操作,代碼如下:,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,Private Sub Command4_Click() On Error Resume Next Comma

44、nd1.Caption = 新增 Command3.Caption = 修改,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,Command1.Enabled = True Command2.Enabled = True Command3.Enabled = True Command4.Enabled =false Command5.Enabled = True Data1.UpdateControls Dala1.Recordset.MoveNext End Sub,命令按鈕Command5_Click事件的功能: 根據(jù)輸入專(zhuān)業(yè)使用SQL語(yǔ)句查找記錄,代碼如下:,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,Pr

45、ivate Sub Command5_Click() Dim mzy As String mzy = InputBox$(請(qǐng)輸入專(zhuān)業(yè), 查找窗) Data1.RecordSource = Select * From 基本情況_ Where 專(zhuān)業(yè) = & mzy & Data1.Refresh,上面的代碼給出了數(shù)據(jù)表內(nèi)數(shù)據(jù)處理的基本方法,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,If Data1.Recordset.EOF Then MsgBox 無(wú)此專(zhuān)業(yè)!, , 提示 Data1.RecordSource = “基本情況” Data1.Refresh End If End Sub,使用Data1_V

46、alidate事件過(guò)濾無(wú)效記錄 例如,對(duì)學(xué)號(hào)字段進(jìn)行測(cè)試,如果學(xué)號(hào)為空則輸入無(wú)效。在例6.5中被學(xué)號(hào)字段所約束的綁定控件是Text1,可用Text1.DataChanged屬性檢測(cè)Text1控件所對(duì)應(yīng)的當(dāng)前記錄中的字段值的內(nèi)容是否發(fā)生了變化,Action=6表示Update操作。 使用數(shù)據(jù)控件的箭頭按鈕改變當(dāng)前記錄,則完成添加的新記錄或?qū)σ延杏涗浀男薷牡娜蝿?wù)。 而單擊數(shù)據(jù)控件的箭頭按鈕時(shí)會(huì)觸發(fā)Validate事件,在該事件中,可以根據(jù)Action取值(14)來(lái)判斷單擊了數(shù)據(jù)控件哪一個(gè)箭頭按鈕。,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,Private Sub Da

47、ta1_Validate(Action As Integer, Save As Integer) If Text1.Text = And _ (Action = 6 Or Text1.DataChanged) Action=6表示Update操作 Then MsgBox 數(shù)據(jù)不完整,必須要有學(xué)號(hào)! Data1.UpdateControls 讀回原數(shù)據(jù) End If,6.3.4 數(shù)據(jù)庫(kù)記錄的增刪改操作,If Action = 1 And Action = 4 Then Command1.Caption = 新增 Command3.Caption = 修改 Command1.Enabled = True Command2.Enabled = True Command3.Enabled = True Command4.Enabled = False End If End Sub,MoveFirst,

溫馨提示

  • 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)論