11.1 數(shù)據(jù)庫(kù)(DateBase)的基本概念 一、概念與術(shù)語(yǔ) 目
前幾乎所有的應(yīng)用程序都需要存放大量的數(shù)據(jù),這些大量數(shù)據(jù)一般都需要經(jīng)過(guò)數(shù)據(jù)收集、分析后,整理成一定的組織結(jié)構(gòu),通過(guò)數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)進(jìn)行管理。數(shù)據(jù)庫(kù)
管理系統(tǒng)提供了數(shù)據(jù)在數(shù)據(jù)庫(kù)內(nèi)存放方式的管理能力,使程序設(shè)計(jì)人員在使用數(shù)據(jù)庫(kù)時(shí)不需要考慮數(shù)據(jù)的具體操作及數(shù)據(jù)之間的關(guān)系。 數(shù)據(jù)庫(kù)是一組排列成易于處理和讀取的相關(guān)信息的集合。數(shù)據(jù)庫(kù)按其模型結(jié)構(gòu)可分為層次數(shù)據(jù)庫(kù)、網(wǎng)狀數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)。其中關(guān)系數(shù)據(jù)庫(kù)的理論發(fā)展最為完備,因此到目前為止關(guān)系數(shù)據(jù)庫(kù)的應(yīng)用最為廣泛。 Visual Basic默認(rèn)的數(shù)據(jù)庫(kù)為微軟的Access數(shù)據(jù)庫(kù),可在Visual
Basic中利用數(shù)據(jù)庫(kù)管理器直接創(chuàng)建,數(shù)據(jù)庫(kù)文件的擴(kuò)展名為.MDB。除此之外,Visual
Basic還可以處理各種外部數(shù)據(jù)庫(kù),如dBASE、FoxPro、Paradox、Btrieve、Microsoft
Excel、Lotus1-2-3、Text等格式的數(shù)據(jù)庫(kù),甚至其它非關(guān)系的數(shù)據(jù)庫(kù),VB在調(diào)用這些數(shù)據(jù)時(shí),都會(huì)自動(dòng)將其轉(zhuǎn)換為關(guān)系型的數(shù)據(jù)庫(kù)來(lái)操作。 1. 數(shù)據(jù)表(Table) 數(shù)據(jù)表是一組相關(guān)聯(lián)的按行與列排列的邏輯數(shù)據(jù)的集合,簡(jiǎn)稱(chēng)為表。在數(shù)據(jù)庫(kù)理論中常用來(lái)表示一個(gè)實(shí)體,每個(gè)數(shù)據(jù)表必須有一個(gè)表名,一個(gè)數(shù)據(jù)庫(kù)一般由多個(gè)數(shù)據(jù)表組成,各個(gè)數(shù)據(jù)表之間一般應(yīng)存在某種關(guān)系。 2. 字段(Field) 數(shù)據(jù)表中的每一列稱(chēng)為一個(gè)字段。數(shù)據(jù)表是由其包含的所有字段構(gòu)成的,每個(gè)字段用來(lái)描述它包含的數(shù)據(jù)。在創(chuàng)建數(shù)據(jù)表時(shí),必須為每個(gè)字段起一個(gè)名稱(chēng)一般稱(chēng)為字段名,同時(shí)需要為每個(gè)字段分配一個(gè)數(shù)據(jù)類(lèi)型、最大長(zhǎng)度和其它屬性。 3. 記錄(Record) 數(shù)據(jù)表中的每一行稱(chēng)為一條記錄。記錄是字段值的集合,所有用戶(hù)對(duì)數(shù)據(jù)的訪問(wèn)對(duì)象是記錄,因此,如果想對(duì)某個(gè)數(shù)據(jù)項(xiàng)進(jìn)行訪問(wèn),必須首先進(jìn)行記錄定位,嚴(yán)格的說(shuō),在一個(gè)數(shù)據(jù)表中不允許存在兩條完全相同的記錄。 4. 關(guān)鍵字(Keyword) 如果數(shù)據(jù)表中某個(gè)字段值或若干個(gè)字段值的集合能唯一確定一條記錄,則稱(chēng)該字段或字段的集合為該數(shù)據(jù)表的關(guān)鍵字。在一個(gè)數(shù)據(jù)表中,關(guān)鍵字可能存在多個(gè),但需選定其中一個(gè)作為主關(guān)鍵字。對(duì)于數(shù)據(jù)表中的每條記錄來(lái)說(shuō),主關(guān)鍵字的值必須唯一。 5. 索引(Index) 為了提高訪問(wèn)數(shù)據(jù)庫(kù)的速度,大多數(shù)數(shù)據(jù)庫(kù)都使用索引。索引即對(duì)數(shù)據(jù)表中的某個(gè)或幾個(gè)字段的值按某種特定的順序進(jìn)行排列。在VB中利用索引可以加快數(shù)據(jù)檢索速度。 6. 結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL) SQL(Structure Query Language)是結(jié)構(gòu)化查詢(xún)語(yǔ)言的縮寫(xiě),是數(shù)據(jù)庫(kù)中通用的數(shù)據(jù)查詢(xún)編程語(yǔ)言,它是我們?cè)L問(wèn)數(shù)據(jù)庫(kù)的一種利器。在Visual
Basic 中訪問(wèn)數(shù)據(jù)庫(kù)時(shí),就可以利用SQL同數(shù)據(jù)庫(kù)進(jìn)行通訊。 二、數(shù)據(jù)庫(kù)的設(shè)計(jì) 數(shù)據(jù)庫(kù)的設(shè)計(jì)一般需要借助E-
R圖進(jìn)行數(shù)據(jù)建模,然后把整個(gè)E-R圖中的每個(gè)實(shí)體和有關(guān)的聯(lián)系,都轉(zhuǎn)化為關(guān)系。對(duì)每個(gè)關(guān)系再進(jìn)行規(guī)范化,最后給出各個(gè)數(shù)據(jù)表完成數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì),對(duì)每
個(gè)關(guān)系來(lái)說(shuō),在選定的數(shù)據(jù)庫(kù)管理系統(tǒng)下,創(chuàng)建數(shù)據(jù)庫(kù)、數(shù)據(jù)表以及它們之間的關(guān)系,并輸入數(shù)據(jù)進(jìn)行測(cè)試,完成數(shù)據(jù)庫(kù)的物理設(shè)計(jì)。具體內(nèi)容請(qǐng)讀者參考相關(guān)的數(shù)
據(jù)庫(kù)理論方面的書(shū)籍。 11.2 Visual Basic的可視數(shù)據(jù)管理器 Visual Basic 所支持的不同類(lèi)型的數(shù)據(jù)庫(kù)大都可以通過(guò)相應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)建立,如在MS
Access中可以建立.MDB的數(shù)據(jù)庫(kù)。也可以使用Visual Basic下的數(shù)據(jù)庫(kù)管理器來(lái)管理數(shù)據(jù)庫(kù)。 啟動(dòng)數(shù)據(jù)庫(kù)管理器有兩種方法: (1)在Visual Basic集成環(huán)境中,單擊“外接程序”菜單下的“可視化數(shù)據(jù)管理器”命令,即可打開(kāi)可視化數(shù)據(jù)管理器“VisData”窗口,如圖11-1所示。 (2)直接運(yùn)行Visual Basic系統(tǒng)目錄中的VisData.exe程序文件來(lái)啟動(dòng)可視化數(shù)據(jù)管理器。 VisData窗口由菜單欄、工具欄、工作區(qū)窗口與狀態(tài)欄組成,剛啟動(dòng)時(shí)其工作區(qū)窗口為空。 圖11.2-1 可視化數(shù)據(jù)管理器窗口 一、可視數(shù)據(jù)管理器的使用 使用開(kāi)可視化數(shù)據(jù)管理器建立默認(rèn)數(shù)據(jù)庫(kù)――Access數(shù)據(jù)庫(kù)的步驟如下: 1.單擊“文件”菜單下的“新建”菜單項(xiàng),將出現(xiàn)如圖12-2所示的選擇。單擊數(shù)據(jù)庫(kù)類(lèi)型菜單中的Access將出現(xiàn)版本子菜單,在版本菜單中選擇要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)版本后,出現(xiàn)如圖11-3所示的窗口。 圖11.2-2 “文件”菜單下的“新建”子菜單
圖11.2-3 創(chuàng)建數(shù)據(jù)庫(kù)窗口 2.單擊“保存”按鈕后,將會(huì)出現(xiàn)如圖11.2-4所示的窗口。 圖11.2-4 數(shù)據(jù)庫(kù)窗口與SQL語(yǔ)句窗口 3.右擊數(shù)據(jù)庫(kù)窗口,出現(xiàn)如圖1.2-5所示的窗口。 圖11-5 數(shù)據(jù)庫(kù)窗口 4.單擊“新建表”按鈕,即可打開(kāi)如圖11.2-6所示窗口。即可新建表。 圖11.2-6 表結(jié)構(gòu)窗口 5.然后單擊“添加字段”按鈕,可建立各個(gè)字段的屬性,最后單擊“新建表”按鈕,即可建立起表結(jié)構(gòu)。有了表結(jié)構(gòu)后就可對(duì)表進(jìn)行數(shù)據(jù)的添加、修改和刪除等操作。 11.3 ADO數(shù)據(jù)控件 一、編寫(xiě)一個(gè)簡(jiǎn)單數(shù)據(jù)庫(kù)程序 首先介紹Visual Basic所提供的兩個(gè)控件ADO Data Control(簡(jiǎn)稱(chēng)ADODC)和DataGrid處理數(shù)據(jù)庫(kù)程序的方法。ADO
Data Control和DataGrid都屬于ActiveX控件,它們?cè)谑褂们靶枰葘⑵涮砑拥焦ぞ呦渲?,以便在工程中使用。單?#8220;工程/部件”菜單項(xiàng),打開(kāi)“部件”對(duì)話框,選定所需要的控件并確定,即可將其添加的工具箱中,如圖11.3-1所示。 圖11.3-1 添加ADODC與DataGrid控件到工具箱 在窗體上添加ADODC與DataGrid控件,如圖11-8所示,然后右擊ADODC控件,選擇其快捷菜單下“ADODC屬性”則打開(kāi)如圖11-9所示的界面。 圖11.3-2 窗體窗口
圖11.3-3 屬性頁(yè)窗口 在上圖中,單擊生成“按鈕”,則打開(kāi)如圖11.3-4所示的數(shù)據(jù)鏈接屬性窗口。 圖11.3-4 數(shù)據(jù)鏈接屬性窗口 在圖11.3-4中選中“Microsoft Jet 3.51 OLE DB Provider”,單擊下一步按鈕,進(jìn)入如圖11.3-5所示的數(shù)據(jù)鏈接屬性窗口。 【注】Microsoft Jet 3.51 OLE DB Provider只能打開(kāi)Access97下的數(shù)據(jù)庫(kù),不能打開(kāi)Access2000及以上版本的數(shù)據(jù)庫(kù),如要打開(kāi)Access2000下的數(shù)據(jù)庫(kù),則必須選用Jet
4.0,否則系統(tǒng)會(huì)出錯(cuò)。 圖11.3-5 數(shù)據(jù)鏈接屬性窗口 在圖11.3-5中,單擊“…”按鈕,選擇所要打開(kāi)的數(shù)據(jù)庫(kù)文件后確定,即可單擊“測(cè)試連接”按鈕,測(cè)試是否連接成功。如果測(cè)試連接成功,則單擊“確定”按鈕后,返回圖11.3-2。 【注】如果數(shù)據(jù)庫(kù)文件與工程文件保存在同一個(gè)文件夾下,則可把上圖所示的文件xjgl.mdb前的字符刪除,這樣生成的程序,在復(fù)制到其它計(jì)算機(jī)上后不需重新對(duì)數(shù)據(jù)庫(kù)進(jìn)行連接即可運(yùn)行。 通過(guò)以上步驟,我們只是完成了ADODC控件的ConnectionString屬性設(shè)置,其值如下:Provider=Microsoft.Jet.OLEDB.3.51;Data
Source=e:\xjgl\xjgl.mdb;Persist Security Info=False 該屬性由三個(gè)參數(shù)組成: 然后把ADODC
控件的CommandType屬性設(shè)置為adCmdTable,接著單擊RecordSource屬性,可以看到數(shù)據(jù)庫(kù)xjgl.mdb下的所有數(shù)據(jù)表,
單擊“基本情況表”。再選定DataGrid控件,只需把DataSource設(shè)置為ADODC控件即可,完成程序設(shè)計(jì)。運(yùn)行該程序即可對(duì)數(shù)據(jù)庫(kù)
xjgl.mdb下的“基本情況表”進(jìn)行瀏覽。然后把DataGrid控件的AllowAddNew屬性設(shè)置為T(mén)rue、AllowDelete屬性設(shè)置
為T(mén)rue、AllowUpdate屬性設(shè)置為T(mén)rue,再次運(yùn)行該程序,即可對(duì)“基本情況表”進(jìn)行添加、刪除與修改數(shù)據(jù)操作,到目前為止沒(méi)有書(shū)寫(xiě)一行代
碼,就已完成程序設(shè)計(jì)。 二、數(shù)據(jù)庫(kù)文件與ADODC、DataGrid的關(guān)系 1.ADODC與數(shù)據(jù)庫(kù)文件的關(guān)系 數(shù)據(jù)庫(kù)文件是一種格式十分復(fù)雜的文件,對(duì)任何一個(gè)程序員來(lái)說(shuō),如果想自行解析文件格式進(jìn)而存取數(shù)據(jù)庫(kù)中的內(nèi)容,都是一件十分困難的事情。因此VB提供了ADODC控件,其功能是進(jìn)行數(shù)據(jù)庫(kù)文件結(jié)構(gòu)分析,并且根據(jù)程序?qū)?lái)可能操作數(shù)據(jù)庫(kù)(如:讀取、寫(xiě)入、新增、刪除等),建立必要的操作接口(包含屬性、方法和事件),然后封裝成為一個(gè)控件。 對(duì)數(shù)據(jù)庫(kù)程序而言,如果通過(guò)ADODC控件來(lái)存取數(shù)據(jù),則不必了解數(shù)據(jù)庫(kù)文件格式,只要通過(guò)ADODC所提供的操作接口,即可達(dá)到存取數(shù)據(jù)庫(kù)的目的。數(shù)據(jù)庫(kù)程序、ADODC控件與數(shù)據(jù)庫(kù)文件三者之間的關(guān)系用下圖表示:
ADODC
圖11.3-6 數(shù)據(jù)庫(kù)文件與ADODC控件的關(guān)系 2.DataGrid與ADODC之間的關(guān)系 雖然ADODC控件具有存取數(shù)據(jù)庫(kù)數(shù)據(jù)的能力,但卻沒(méi)有提供顯示數(shù)據(jù)的功能,如果想要顯示數(shù)據(jù)庫(kù)的內(nèi)容,除了利用ADODC來(lái)讀取數(shù)據(jù)之外,還得編寫(xiě)顯示數(shù)據(jù)的程序。 1)利用DataGrid來(lái)顯示數(shù)據(jù) 要使用DataGrid
來(lái)顯示數(shù)據(jù)庫(kù)內(nèi)容必須設(shè)置好它的DataSource屬性,這個(gè)屬性的作用是讓DataGrid控件與ADODC控件產(chǎn)生連接關(guān)系,也就是告訴
DataGrid控件它所存取的是哪一個(gè)ADODC所打開(kāi)的數(shù)據(jù)庫(kù),接著DataGrid就會(huì)自動(dòng)使用ADODC的接口,將數(shù)據(jù)庫(kù)的內(nèi)容顯示出來(lái)。其關(guān)系
如圖11.3-7: 數(shù)據(jù)庫(kù)程序 圖11.3-7
DataGrid與ADODC控件的關(guān)系 2)關(guān)鍵屬性和參數(shù)總結(jié) ADODC控件的屬性及參數(shù): (1)ConnectionString(連接字符串)屬性:該屬性有兩個(gè)重要參數(shù)Provider和Data
Source。 Provider參數(shù):Provider是OLE DB Provider的簡(jiǎn)稱(chēng),其主要用途在于指定存取數(shù)據(jù)庫(kù)所使用的OLE
DB驅(qū)動(dòng)程序。如“Microsoft Jet 3.51 OLE DB Provider”。 Data Source(數(shù)據(jù)源)參數(shù):此參數(shù)通常用來(lái)指定數(shù)據(jù)庫(kù)文件的完整路徑和文件名。有了此參數(shù),ADODC控件才能打開(kāi)指定的數(shù)據(jù)庫(kù)文件。 (2)CommandType(命令類(lèi)型)屬性:共有四個(gè)值:adCmdTable(數(shù)據(jù)表)、adCmdText(指令)、adCmdStoredProc(存儲(chǔ)過(guò)程)、adCmdUnknown(未定義)。 (3)RocordSoure(記錄源)屬性:指定確定的表。 DataGrid控件的屬性: (1)DataSource(數(shù)據(jù)源)屬性:由于DataGrid控件并不直接存取數(shù)據(jù)庫(kù)中的數(shù)據(jù),因此必須將其屬性設(shè)置成某一個(gè)ADODC控件,DataGrid控件才能具備存取數(shù)據(jù)庫(kù)的能力。 (2)AllowAddNew(允許新增)屬性:若允許用戶(hù)新增數(shù)據(jù),須將此屬性設(shè)置為T(mén)rue。 (3)AllowDelete(允許刪除)屬性:若允許用戶(hù)新增數(shù)據(jù),須將此屬性設(shè)置為T(mén)rue。 (4)AllowUpdate(允許更新)屬性:此屬性的默認(rèn)值為T(mén)rue。 三、Visual Basic中與數(shù)據(jù)庫(kù)中相關(guān)的對(duì)象 就像數(shù)據(jù)庫(kù)是有組織結(jié)構(gòu)的一樣,VB所提供的數(shù)據(jù)庫(kù)對(duì)象也是有組織的,而且與數(shù)據(jù)庫(kù)的組織結(jié)構(gòu)有著很好的對(duì)應(yīng)關(guān)系。 1.Field對(duì)象與字段 字段是數(shù)據(jù)庫(kù)中最小的數(shù)據(jù)單位。在VB所提供的對(duì)象中,與字段對(duì)應(yīng)的對(duì)象是Field,我們從Field對(duì)象的以下屬性可以得知字段的相關(guān)信息: Name屬性:字段的名稱(chēng) Value屬性:字段的數(shù)據(jù) Name屬性 Field對(duì)象
Value屬性 2.Fields集合對(duì)象與數(shù)據(jù)記錄 對(duì)VB所提供的對(duì)象而言,F(xiàn)ield對(duì)象的集合構(gòu)成Fields集合對(duì)象,所以Fields集合對(duì)象可以視為與數(shù)據(jù)庫(kù)記錄對(duì)應(yīng)的對(duì)象。 Fields對(duì)象編號(hào):0 1 2
Fields(0)
Fields(1) Fields(2) 共同構(gòu)成Fields集合對(duì)象 由于Fields是一個(gè)集合對(duì)象,所以可以利用Count屬性得知某一個(gè)Fields集合對(duì)象中的Field對(duì)象的數(shù)目,并可利用下面的方法顯示集合中的Field對(duì)象的內(nèi)容,如: For i=0 to fds.Count-1 ‘fds為一個(gè)Fields集合對(duì)象 Debug.Print fds(i).Name ‘顯示字段名稱(chēng) Debug.Print fds(i).Value ‘顯示字段數(shù)據(jù)內(nèi)容 Next 3.Recordset對(duì)象與數(shù)據(jù)記錄集合 Visual Basic中與數(shù)據(jù)表對(duì)應(yīng)的對(duì)象稱(chēng)為Recordset對(duì)象,先介紹“當(dāng)前數(shù)據(jù)記錄”的概念。 1)由于數(shù)據(jù)庫(kù)無(wú)法將整個(gè)數(shù)據(jù)表完全裝入到內(nèi)存中,因此便規(guī)定程序每次只能存取一條記錄,此記錄數(shù)據(jù)就稱(chēng)為“當(dāng)前記錄數(shù)據(jù)”。 注:雖然程序每次只能存取當(dāng)前記錄數(shù)據(jù),但并不表示數(shù)據(jù)庫(kù)每次只裝入一條記錄數(shù)據(jù),為了提高執(zhí)行效率,數(shù)據(jù)庫(kù)每次會(huì)裝入一大段記錄數(shù)據(jù),但程序存取的動(dòng)作還是以一條為單位。 2)利用Recordset對(duì)象改變當(dāng)前記錄數(shù)據(jù)的方法 程序運(yùn)行后當(dāng)前記錄數(shù)據(jù),將定位于第一條記錄。若要改變當(dāng)前記錄,程序必須調(diào)用Recoedset對(duì)象的方法改變當(dāng)前數(shù)據(jù)記錄,方可存取每一條數(shù)據(jù)記錄,進(jìn)而達(dá)到存取整個(gè)數(shù)據(jù)表的功能。下表為Recoedset對(duì)象的幾個(gè)常用方法。
如圖11.3-8為Visual Basic中幾個(gè)對(duì)象間的關(guān)系。
11.3-8 ADODC、Recordset、Fields、Field幾個(gè)對(duì)象關(guān)系圖 在上圖中位于下方的稱(chēng)為上方對(duì)象的子對(duì)象。若要存取某一個(gè)對(duì)象,必須從最上層的父對(duì)象向下指定對(duì)象的路徑。如: Adodc1.Recordset Adodc1.Recordset.Fields Adodc1.Recordset.Fields(i) 11.4 Recordset對(duì)象 Recordset
對(duì)象是數(shù)據(jù)記錄的集合,而數(shù)據(jù)記錄又是字段的集合,因此利用Recordset對(duì)象,在程序中就可以存取所有數(shù)據(jù)記錄的每一個(gè)字段的數(shù)據(jù)了,所以說(shuō)
Recordset對(duì)象是存取數(shù)據(jù)庫(kù)數(shù)據(jù)最重要的源頭。在數(shù)據(jù)庫(kù)的程序設(shè)計(jì)中,Recordset對(duì)象是最為重要的對(duì)象。 一、Recordset與數(shù)據(jù)表的存取 前面介紹幾個(gè)改變Recordset對(duì)象的當(dāng)前數(shù)據(jù)記錄的方法――MoveNext、MovePrevious、MoveFirst、MoveLast方法,通過(guò)這幾個(gè)方法就可以存取整個(gè)數(shù)據(jù)表的數(shù)據(jù)。其關(guān)系可用圖11-15來(lái)表示。
MoveFirst MovePrevious MoveNext MoveLast
當(dāng)前記錄
以Recordset.Fields來(lái)存取
圖11.4-1 Recordset對(duì)象與數(shù)據(jù)表之間的關(guān)系 如程序: for I=0 to
Adodc1.Recordset.Fields.Count-1 Debug.Print
Adodc1.Recordset.Fields(i).Value Next 1.避免沒(méi)有當(dāng)前數(shù)據(jù)記錄的錯(cuò)誤 利用MovePrevious、MoveNext移到記錄指針時(shí),應(yīng)注意移過(guò)頭現(xiàn)象發(fā)生。所謂移過(guò)頭是指: 指針位于第一天記錄時(shí),調(diào)用MovePrevious方法。 指針位于最后一條記錄時(shí),調(diào)用Monenext方法。 我們可以利用Recordset對(duì)象的EOF或BOF屬性,來(lái)加以判斷。 BOF及EOB屬性的應(yīng)用: Adodc1.Recordset.MoveFirst While
Not Adodc1.Recordset.Eof s=”” For
I=0 to Adodc1.Recordset.Fields.Count-1 s=s
& Adodc1.Recordset.Fields(i).Value & vbTab Next List1.Additem s Adodc1.Recordset.MoveNext Wend Adodc1.Recordset.MoveNext While
Not Adodc1.Recordset.Bof s=”” For
I=0 to Adodc1.Recordset.Fields.Count-1 s=s
& Adodc1.Recordset.Fields(i).Value & vbTab Next List1.Additem s Adodc1.Recordset.MovePrevious Wend 2. 存取字段數(shù)據(jù)的幾種各數(shù) 1)Adodc1.Recordset.Fields(i).Value 如:Adodc1.Recordset.Fields(0).Value 2)Adodc1.Recordset.Fields(字段名稱(chēng)).Value 如:Adodc1.Recordset.Fields(“學(xué)號(hào)”).Value 3.省略.Value的語(yǔ)句
如:Adodc1.Recordset.Fields(“股票代號(hào)”) 4.省略.Fields的語(yǔ)句
如:Adodc1.Recordset(“股票代號(hào)”) 5.Recordset![字段名稱(chēng)]
字段名稱(chēng)不能加引號(hào) 【注】Recordset(“字段名稱(chēng)”)最容易書(shū)寫(xiě)。 二、Recordset與數(shù)據(jù)記錄的增刪修改 在前面我們使用DataGrid控件的AllowAdd屬性和AllowDelete屬性設(shè)置為T(mén)rue,使它具有修改、增加和刪除數(shù)據(jù)的功能。但大批數(shù)據(jù)的處理使用該方法不方便,下面介紹Recordset對(duì)象修改、增加和刪除數(shù)據(jù)的方法。 1. 刪除數(shù)據(jù)記錄 首先要將欲刪除的記錄置為當(dāng)前記錄,然后調(diào)用Recordset.Delete方法進(jìn)行刪除。如: Adodc1.Recordset.MoveLast Adodc1.Recordset.Delete 刪除多條記錄時(shí),在Delete方法后加上DoEvents語(yǔ)句。 2. 修改數(shù)據(jù)記錄 修改數(shù)據(jù)記錄分兩步走,先把數(shù)據(jù)寫(xiě)到緩沖區(qū),然后再寫(xiě)入數(shù)據(jù)庫(kù)。數(shù)據(jù)寫(xiě)入可調(diào)用Recordset.Update方法和使用Move…方法。其具體過(guò)程如下: 方法一: Adodc1.Recordset(“字段名稱(chēng)1”)=字段新值 Adodc1.Recordset(“字段名稱(chēng)2”)=字段新值 … Adodc1.Recordset.Update 方法二: Adodc1.Recordset(“字段名稱(chēng)1”)=字段新值 Adodc1.Recordset(“字段名稱(chēng)2”)=字段新值 … Adodc1.Recordset.MoveNext CancelUpdate方法:取消更新的數(shù)據(jù) 除了調(diào)用Update方法或改變當(dāng)前數(shù)據(jù)記錄的位置來(lái)使要更新的數(shù)據(jù)立即寫(xiě)入到數(shù)據(jù)庫(kù)中之外,Recordset對(duì)象也允許在修改數(shù)據(jù)記錄之后,數(shù)據(jù)尚未寫(xiě)入數(shù)據(jù)庫(kù)之前,將更新的數(shù)據(jù)撤消,讓表中的數(shù)據(jù)恢復(fù)原狀,此時(shí)調(diào)用的方法是CancelUpdate方法。 3. 新增數(shù)據(jù)記錄 新增數(shù)據(jù)記錄是先建立一個(gè)緩沖區(qū),并將此緩沖區(qū)設(shè)置為當(dāng)前記錄,然后就可以像修改記錄的數(shù)據(jù)一樣,修改當(dāng)前記錄的內(nèi)容。最后,如果確定要新增該條記錄數(shù)據(jù),就調(diào)用Update方法或移動(dòng)當(dāng)前數(shù)據(jù)記錄將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)中;如果要取消新增的記錄數(shù)據(jù)的操作,就調(diào)用CancelUpdate方法,其新增記錄數(shù)據(jù)的語(yǔ)句大致如下: Adodc1.Recordset.AddNew Adodc1.Recordser(“字段名稱(chēng)1”)=
“新的字段值1” Adodc1.Recordser(“字段名稱(chēng)2”)=
“新的字段值2” … Adodc1.Recordset.Update
或Adodc1.Recordset.CancelUpdate 三、Recordset與數(shù)據(jù)記錄的檢索 1.檢索數(shù)據(jù)記錄的方法 1)Find方法 格式:Recordset.Find
Criteria,SkipRows,SearchDirection,Start 參數(shù)1:Criteria:檢索記錄數(shù)據(jù)的表達(dá)式。如:“語(yǔ)文>85”。該參數(shù)的變化相當(dāng)多,稍后進(jìn)一步說(shuō)明。 參數(shù)2:SkipRows:跳過(guò)幾條記錄開(kāi)始檢索??墒÷裕羰÷云淠J(rèn)值為0,表示從第一條記錄開(kāi)始。 參數(shù)3:SearchDirection:檢索的方向??梢允莂dSearchForward或adSearchBackward,可以省略,若省略表示向下檢索。 參數(shù)4:Start:開(kāi)始檢索的位置??墒÷?,若省略表示從當(dāng)前數(shù)據(jù)記錄開(kāi)始檢索。 2)檢索結(jié)果與當(dāng)前記錄 如果調(diào)用Find方法后找到符合要求的記錄數(shù)據(jù),則當(dāng)前記錄將移至被找到的記錄,否則當(dāng)前記錄數(shù)據(jù)變成不存在??衫肦ecordset對(duì)象的BOF、EOF屬性進(jìn)行判斷。 2. 檢索數(shù)據(jù)記錄的表達(dá)式 在Find方法的參數(shù)中,變化最多的是Criteria參數(shù),在此作進(jìn)一步的討論。 1)表達(dá)式的基本格式 “字段名稱(chēng) 比較運(yùn)算符 比較的數(shù)據(jù)” 2)表達(dá)式的字段名稱(chēng) 表達(dá)式=字段名稱(chēng) 比較符號(hào) 比較的數(shù)據(jù) (1)表達(dá)式中的“字段名稱(chēng)”必須是數(shù)據(jù)表中已存在的字段名稱(chēng)。 (2)如果字段名稱(chēng)中含有空格字符,則字段名稱(chēng)前后必須加[ ]。 3)表達(dá)式之“比較的數(shù)據(jù)” 表達(dá)式=字段名稱(chēng) 比較符號(hào) 比較的數(shù)據(jù) (1)比較的數(shù)據(jù)是常量 比較的數(shù)據(jù)按數(shù)據(jù)類(lèi)型可分為“數(shù)值”、“日期時(shí)間”和“字符串”三種類(lèi)型。
(2)比較的數(shù)據(jù)是變量 設(shè)v為數(shù)值: “字段名稱(chēng)比較符號(hào)>”
& v v為日期數(shù)據(jù):“字段名稱(chēng)比較符號(hào) #” & v & “#” v為字符串: “字段名稱(chēng)比較符號(hào) ‘”
& v “’” 4)表達(dá)式之“比較符號(hào)” 表達(dá)式=字段名稱(chēng) 比較符號(hào) 比較的數(shù)據(jù) VB程序中的比較符號(hào)包含=、<>、>、<、>=、<=均可用于記錄數(shù)據(jù)的比較。此外,Like比符號(hào)也可用于比較表達(dá)式中。其格式: 字段名稱(chēng) Like 比較的字符串 該表達(dá)式用于字符串?dāng)?shù)據(jù)的“近似”(Like)比較,其中“比較的字符串”部分可以包含“%”、“*”或“_”(下劃線)通配符。如: “姓名 Like‘張%’” 11.5 Data-Aware(數(shù)據(jù)識(shí)別)控件 前面介紹了兩種存取數(shù)據(jù)的方法:使用Recordset對(duì)象和DataGrid控件。經(jīng)過(guò)比較容易發(fā)現(xiàn)DataGrid控件比Recordset對(duì)象簡(jiǎn)便得多。。 像DataGrid
控件一樣具有自動(dòng)顯示和更新數(shù)據(jù)功能的控件,稱(chēng)為Data-Aware(數(shù)據(jù)識(shí)別)控件(簡(jiǎn)稱(chēng)數(shù)據(jù)識(shí)別控件)。在Visual
Basic中,除了DataGrid控件外,數(shù)據(jù)識(shí)別還有Label、TextBox、CheckBox、ListBox、ComboBox、
Image、PictureBox、MonthView、DTPicker、DataList、DataCombo等控件。如能充分運(yùn)用,就可在數(shù)據(jù)庫(kù)程
序的設(shè)計(jì)中游刃有余了。 一、數(shù)據(jù)識(shí)別控件的基本概念 數(shù)據(jù)識(shí)別控件分為兩類(lèi):表格式和單欄式。 表格式指DataGrid控件。 單欄式是指每次只能存取當(dāng)前數(shù)據(jù)記錄的某個(gè)字段的數(shù)據(jù)。單欄式控件必須設(shè)置兩個(gè)屬性:DataSource屬性設(shè)置為ADODC控件的名稱(chēng)和DataField(數(shù)據(jù)字段)屬性設(shè)置為某一個(gè)字段名。 二、數(shù)據(jù)識(shí)別控件的選擇
三、舉例-DTPicker控件的使用 單擊“工程/
部件”打開(kāi)部件對(duì)話框,選定Microsoft ADO Data Control6.0(OLEDB)和Microsoft Windows
Common Controls-2
6.0,把ADODC和DTPicker控件添加到工具箱,布置窗體如圖11-11所示,把ADODC控件連接到xjgl.mdb下的“基本情況表”,把
Text1-Text5依次學(xué)號(hào)、姓名、性別、成分和籍貫字段進(jìn)行綁定,DTPicker控件與出生日期字段進(jìn)行綁定,運(yùn)行該程序并單擊DTPicker
控件即出現(xiàn)圖11-16界面,即可對(duì)出生日期字段的值進(jìn)行修改。 圖11.5-1 DTPicker控件的使用 11.6 結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL) 一、 SQL簡(jiǎn)介 1.SQL概念 SQL(Structured Query Language,結(jié)構(gòu)化查詢(xún)語(yǔ)言)是要求數(shù)據(jù)庫(kù)操作其數(shù)據(jù)的語(yǔ)句,它是專(zhuān)門(mén)為數(shù)據(jù)庫(kù)設(shè)計(jì)出來(lái)的語(yǔ)言,比一般的程序語(yǔ)言簡(jiǎn)單。SQL語(yǔ)言主要分成兩部分:DDL(Data
Definition)和DML(Data Manipulation Language)。其中DDL是建立數(shù)據(jù)表和字段的語(yǔ)句集,而DML則是操作記錄數(shù)據(jù)的語(yǔ)句集。 2.SQL基本格式 Select…From… Select
學(xué)號(hào),姓名,籍貫 From 基本情況 3.利用VB下達(dá)Select語(yǔ)句 CommandType屬性:1-adCmdText RecordSource(記錄源)屬性:Select
學(xué)號(hào),姓名,籍貫 From 基本情況表 使用SQL顯示xjgl.mdb下“基本情況表”的步驟: 1) 添加Microsoft ADO Data
Control6.0(OLEDB)和Microsoft DataGrid Control6.0 (OLEDB)到窗體,將ADODC連接到數(shù)據(jù)庫(kù)xjgl.mdb。 2)設(shè)置ADODC控件的RecordSource屬性,如圖11.6-1所示。單擊確定按鈕。 3)將DataGrid控件的DataSource屬性設(shè)置為ADODC控件。 運(yùn)行程序,即可得到如圖11.6-2所示的結(jié)果。 圖11.6-1 SQL的使用 圖11.6-2 SQL運(yùn)行結(jié)果 二、Select語(yǔ)法簡(jiǎn)介 1.基本語(yǔ)法一:Select字段列表 From 數(shù)據(jù)表 1)字段列表的變化一 (1)“*”語(yǔ)法 如果字段列表涵蓋數(shù)據(jù)表中的所有字段,則可用“*”代表。如: select * from 基本情況 (2)as語(yǔ)法 字段列表還可以是別名。如:字段名1 as 別名1,字段名2 as 別名2 2)字段列表的變化二 除了字段名可以成為Select語(yǔ)句的字段列表外,用字段名稱(chēng)組合出的表達(dá)式,也可成為字段列表成員。如: select
學(xué)號(hào),姓名,語(yǔ)文,英語(yǔ),數(shù)學(xué),語(yǔ)文+英語(yǔ)+數(shù)學(xué) as 總分 from 成績(jī) 3)字段列表的變化三 在Select中只要是符合VB規(guī)則的表達(dá)式都可以用來(lái)定義新字段。如: select
right(學(xué)號(hào),2) as 編號(hào),姓名,數(shù)學(xué) from 成績(jī) 2.基本語(yǔ)法二:select…from…where篩選表達(dá)式 如果只想篩選出部分?jǐn)?shù)據(jù),就可增加Where表達(dá)式。 1)篩選表達(dá)式的變化 篩選表達(dá)式中可使用=、>、<、<>、>=、<=等運(yùn)算符,也可使用and、or、not邏輯運(yùn)算符和Like近似比較運(yùn)算符。 (1)字符串的近似(Like)選取 select * from 成績(jī) where 姓名 like ‘王%’ (2)%與_的區(qū)別 2)其它的where篩選表達(dá)式 除使用以上運(yùn)算符外,還可使用以下一些運(yùn)算符: (1)where 字段名稱(chēng) between 值1 and 值2 where 字段名稱(chēng) not between 值1 and 值2 (2)where 字段名稱(chēng) in(值1,值2,…)集合運(yùn)算 (3)where 字段名稱(chēng) is Null與where 字段名稱(chēng) is not Null 如果某一筆記錄的某一字段并未輸入任何數(shù)據(jù),那么該字段就為Null字段。上面的篩選表達(dá)式可以挑出某一字段為Null或非Null的記錄數(shù)據(jù)。 3)VB函數(shù)的使用 其實(shí)VB函數(shù)也可用于where篩選表達(dá)式,如: select * from 成績(jī)單 where mid(姓名,2,1)=‘小’ 3.基本語(yǔ)法三:select…from…order by 字段列表 1)單字段排序 Order By子句主要對(duì)最終輸出結(jié)果進(jìn)行排序,這有助于數(shù)據(jù)的瀏覽與查閱。如: Select
* from 成績(jī) order by 語(yǔ)文 2)多字段排序 如:Select
* from 成績(jī) order by 語(yǔ)文,英語(yǔ),數(shù)學(xué) 3)排序方式 asc(默認(rèn))升序
deac降序 4)select top:限定選取數(shù)據(jù)記錄的條數(shù) 如:select
* from 成績(jī) order by 語(yǔ)文+英語(yǔ)+數(shù)學(xué) desc select
top 10 * from 成績(jī) order by 語(yǔ)文+英語(yǔ)+數(shù)學(xué) desc
`取前十條 select
top 10 percent * from 成績(jī) order by 語(yǔ)文+英語(yǔ)+數(shù)學(xué) `desc 取百分比 三、動(dòng)態(tài)執(zhí)行Select語(yǔ)句的技巧 前面已經(jīng)介紹利用Recordset
對(duì)象的Find方法進(jìn)行數(shù)據(jù)的查找。對(duì)SQL而言,“where
篩選表達(dá)式”中的“篩選表達(dá)式”,與Find方法的“搜尋數(shù)據(jù)的表達(dá)式”在功能上十分類(lèi)似。但Find方法對(duì)數(shù)據(jù)進(jìn)行逐條比較,數(shù)據(jù)量較大時(shí),效率很低。
因此,可先用SQL語(yǔ)句篩選符號(hào)條件的記錄,然后再進(jìn)行Find方法查找。 1.動(dòng)態(tài)執(zhí)行Select語(yǔ)句的技巧 要想動(dòng)態(tài)執(zhí)行某一Select語(yǔ)句,程序必須如下: Adodc1.CommandType=adCmdText Adodc1.RecordSource=Select語(yǔ)句 Adodc1.Refresh 2.動(dòng)態(tài)組合SQL語(yǔ)句的注意事項(xiàng) 字符型數(shù)據(jù):select * from 數(shù)據(jù)表 where 字段名稱(chēng)=’” & Text1.Text & “’” 日期型數(shù)據(jù):select * from 數(shù)據(jù)表 where 字段名稱(chēng)= ” & Text1.Text & “ ” 數(shù)值型數(shù)據(jù):select * from 數(shù)據(jù)表 where 字段名稱(chēng)=” & Text1.Text 3.Where篩選表達(dá)式與Find表達(dá)式的差異 1.Where篩選表達(dá)式可使用邏輯運(yùn)算符and、or、not,F(xiàn)ind表達(dá)式不能使用邏輯運(yùn)算符。 2.Where篩選表達(dá)式中的Between…And和Is Null/Is Not Null均無(wú)法在Find中使用。 3.Where篩選表達(dá)式中可以使用VB函數(shù),而Find表達(dá)式中是不能使用的。 11.7 ADO(Active Data Objects)對(duì)象模型 我們前面一直使用ADODC和其它數(shù)據(jù)識(shí)別控件來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)程序。為了打好數(shù)據(jù)庫(kù)基礎(chǔ),Visual Basic數(shù)據(jù)庫(kù)最核心的對(duì)象群-- Active
Data Objects(簡(jiǎn)稱(chēng)ADO)就是我們必須要掌握的,如圖11-19。
圖 11.7-1 ADO對(duì)象結(jié)構(gòu)圖 一、ADO的首次使用 對(duì)比圖11.3-8中可以看出ADO比 ADODC控件復(fù)雜一點(diǎn),實(shí)際上它們的概念是一致的。在ADO對(duì)象結(jié)構(gòu)圖中可以發(fā)現(xiàn)一個(gè)熟悉的名字—Recordset,它與我們前面使用的Recordset(ADODC的屬性)是相同的對(duì)象。 先看一個(gè)ADO打開(kāi)數(shù)據(jù)庫(kù)的例子: Dim conn As New
ADODB.Connection Dim rs As New
ADODB.Recordset Private Sub
Form_Load() Dim
ConnStr As String ConnStr
= "Provider=Microsoft.Jet.OLEDB.3.51;" & _ "Data
Source=f:\xjgl\xjgl.mdb" conn.Open
ConnStr rs.CursorLocation
= adUseClient rs.Open
"基本情況表", conn, adOpenKeyset, adLockPessimistic End Sub Private Sub
Command1_Click() ' 顯示 Recordset 的所有記錄數(shù)據(jù) Dim
S As String, i As Integer rs.MoveFirst List1.Clear While
Not rs.EOF S="" For
i = 0 To rs.Fields.Count - 1 S=S
& rs.Fields(i).Value & vbTab Next List1.AddItem
S rs.MoveNext Wend End Sub 在以上程序中,使用了MoveFirst、EOF、MoveNext方法和Fields子對(duì)象,使用這些方法和Fields子對(duì)象的對(duì)象不再是Adodc1.Recordset對(duì)象,而是rs對(duì)象。 1.打開(kāi)數(shù)據(jù)庫(kù)(表) 我們?cè)倏匆幌律厦娲蜷_(kāi)數(shù)據(jù)庫(kù)的語(yǔ)句: ConnStr =
"Provider=Microsoft.Jet.OLEDB.3.51;" & _ "Data
Source=e:\xjgl\xjgl.mdb" conn.Open
ConnStr rs.CursorLocation
= adUseClient rs.Open "基本情況表",conn,adOpenKeyset,adLockPessimistic 其主要由三部分組成: Provider參數(shù):用來(lái)指定OLE
DB驅(qū)動(dòng)程序。 DataSource參數(shù):用來(lái)指定數(shù)據(jù)庫(kù)的來(lái)源,它與Provider參數(shù)合起來(lái)構(gòu)成“連接字符串”。 股票行情表:出現(xiàn)在rs.Open方法的參數(shù),用來(lái)指定想要打開(kāi)的數(shù)據(jù)表。 結(jié)論:通過(guò)比較我們發(fā)現(xiàn)前面兩個(gè)例子打開(kāi)數(shù)據(jù)庫(kù)的方法幾乎是一樣的,ADODC控件仍調(diào)用ADO所提供的方法來(lái)打開(kāi)數(shù)據(jù)庫(kù)(表)。 2.使用ADO對(duì)象之前 在使用ADO對(duì)象之前,必須先利用VB菜單的“工程/引用”來(lái)引用“Microsoft Active Data Objects 2.0
Library”,如圖11-20所示,然后ADO對(duì)象群中Connection、Recordset、Command、Fields等對(duì)象才會(huì)成為可以引用的對(duì)象。否則,類(lèi)似下面的語(yǔ)句: dim
conn as new ADODB.Connection dim
rs as New ADODB.Recordset 都會(huì)產(chǎn)生“用戶(hù)定義類(lèi)型未定義”的錯(cuò)誤,因?yàn)?#8220;Connection”和“Recordset”都是定義在“Microsoft Active Data Objects 2.0
Library”中的。如果沒(méi)有事先將其引用的話,VB將無(wú)法辨識(shí)它們。 圖11.7-2 Microsoft Active
Data Objects 2.0 Library的引用 3.使用ADO的基本概念 從以上例子中我們可以看到,使用ADODC比使用ADO要簡(jiǎn)單得多,但使用ADO比使用ADODC專(zhuān)業(yè)的多。 “對(duì)象類(lèi)別”的引用及表示法: 語(yǔ)句格式:dim rs as ADODB.Recordset 其中,rs稱(chēng)為“對(duì)象變量”,Recordset稱(chēng)為“對(duì)象類(lèi)別名稱(chēng)”,ADODB則稱(chēng)為“對(duì)象類(lèi)別模塊”,整個(gè)語(yǔ)句被解釋為“建立一個(gè)Recordset類(lèi)別的對(duì)象變量、而Recordset對(duì)象類(lèi)型是來(lái)自ADODB對(duì)象類(lèi)別模塊的”。 注意:ADODB正是“Microsoft Active Data Objects 2.0 Library”在程序設(shè)計(jì)中的簡(jiǎn)稱(chēng)。 二、Connection對(duì)象:操作數(shù)據(jù)庫(kù)的源頭 ADO對(duì)象群以Connection對(duì)象為源頭,通過(guò)Connection對(duì)象才可以打開(kāi)其下面的Recordset及Command對(duì)象,進(jìn)而對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。 1.Connection對(duì)象的建立及打開(kāi) 1)Connection對(duì)象的建立 要使用某一對(duì)象時(shí),必須經(jīng)過(guò)“定義”和“建立”兩個(gè)步驟。即: Dim
conn as ADODB.Connection ‘定義一個(gè)Connection類(lèi)別的對(duì)象變量 Set
conn=New ADODB.Connection ‘建立對(duì)象,并指定給conn對(duì)象變量 也可合二為一: Dim
conn as New ADODB.Connection 2)Connection對(duì)象的打開(kāi) 以上語(yǔ)句只是建立了Connection對(duì)象,還無(wú)法使用。要想使用Connection對(duì)象,就必須指定OLE DB Provider和Data Source兩個(gè)參數(shù),然后再調(diào)用Open方法。如: Connstr=“Provider=Microsoft.Jet.OLEDB3.51;”
& “Data Source=f:\xjgl\xjgl.mdb” Conn.Open
Connstr 2.?dāng)?shù)據(jù)表的打開(kāi)與Connection對(duì)象 打開(kāi)數(shù)據(jù)表可用以下語(yǔ)句 Dim
conn as New ADODB.Connection Connstr=“Provider=Microsoft.Jet.OLEDB3.51;”
& “Data Source= f:\xjgl\xjgl.mdb” Conn.Open
Connstr Rs.CursorLocation=adUseClient Rs.Open
“基本情況”,conn,adOpenKeyset,adLockPessimistic 3.Connection對(duì)象的關(guān)閉及釋放 當(dāng)程序不再使用數(shù)據(jù)庫(kù)時(shí),可以調(diào)用Connection對(duì)象的Close方法將其關(guān)閉。 1)Connection對(duì)象的關(guān)閉 Dim
conn as New ADODB.Connection Connstr=“Provider=Microsoft.Jet.OLEDB3.51;”
& “Data Source= f:\xjgl\xjgl.mdb” Conn.Open
Connstr Rs.CursorLocation=adUseClient Rs.Open
“基本情況”,conn,adOpenKeyset,adLockPessimistic … conn.Close 2.Connection對(duì)象的歸還 Connection對(duì)象一經(jīng)關(guān)閉,Connection對(duì)象和Recordset對(duì)象就不可使用,但Connection對(duì)象仍然存在,還會(huì)占有一定的系統(tǒng)資源,如果想完全釋放,則必須調(diào)用以下語(yǔ)句: Set conn=Nothing 總結(jié):從Connection對(duì)象的建立、打開(kāi)數(shù)據(jù)庫(kù)、打開(kāi)數(shù)據(jù)表、關(guān)閉數(shù)據(jù)庫(kù)到歸還Connection對(duì)象所占有的系統(tǒng)資源,其完整過(guò)程如下: ‘步驟一:建立Connection對(duì)象 dim conn as New ADODB.Connection ‘步驟二:打開(kāi)數(shù)據(jù)庫(kù) conn.Open ConnStr ‘步驟三:打開(kāi)數(shù)據(jù)表 Rs.CursorLocation=adUseClient Rs.Open “基本情況”,conn,adOpenKeyset,adLockPessimistic … ‘步驟四:關(guān)閉數(shù)據(jù)庫(kù) conn.Close ‘步驟五:歸還Connection對(duì)象所占用的系統(tǒng)資源 Set conn=Nothing 一般會(huì)省略第四步和第五步,因?yàn)槌绦蜿P(guān)閉時(shí),該程序所打開(kāi)的數(shù)據(jù)庫(kù)會(huì)自動(dòng)關(guān)閉,而Connection對(duì)象所占用的系統(tǒng)資源也會(huì)自動(dòng)釋放給系統(tǒng)。 三、Command對(duì)象與SQL語(yǔ)句的執(zhí)行 Command對(duì)象也是ADO對(duì)象群的一員。Command對(duì)象主要是專(zhuān)門(mén)用來(lái)執(zhí)行SQL語(yǔ)句的。 我們先來(lái)回憶一下前面介紹的SQL語(yǔ)句的執(zhí)行過(guò)程: ‘使用ADODC Adodc1.RecordSource=SQL語(yǔ)句 Adodc1.CommandType=adCmdText Adodc1.Refresh ‘使用Recordset.Open方法執(zhí)行SQL語(yǔ)句 rs.Open
SQL語(yǔ)句,conn,adopenDynamic,adLockOptimistic 顯然,上面兩種方法都沒(méi)有使用Command對(duì)象,但一樣執(zhí)行SQL語(yǔ)句。 1.Command對(duì)象執(zhí)行SQL語(yǔ)句 Dim
conn As New ADODB.Connection Dim
cmd As New ADODB.Command Dim
rs As New ADODB.Recordset Set
cmd.ActiveConnection = conn SQL
= "Select * From 基本情況表Where 姓名 Like '李%'" cmd.CommandText
= SQL Set
rs = cmd.Execute 做一個(gè)對(duì)比:
SQL語(yǔ)句 Recordset對(duì)象 rs.Open
SQL,conn Connection對(duì)象 Command對(duì)象
Set Cmd.ActiveConnection=conn
Cmd.CommandText=SQL
Connection對(duì)象
Set rs=Cmd.Execute SQL語(yǔ)句 通過(guò)以上比較發(fā)現(xiàn),兩種方法其實(shí)是同樣的。 2.帶參數(shù)的SQL語(yǔ)句 其實(shí)Command對(duì)象最大的妙用在于執(zhí)行“帶參數(shù)的SQL語(yǔ)句”。如: Select * from 成績(jī) where 語(yǔ)文 between [low] and [high]
between 60 and 90 3.執(zhí)行帶參數(shù)的SQL語(yǔ)句 如何執(zhí)行帶參數(shù)的SQL語(yǔ)句?如下: Set cmd.ActiveConnection = conn SQL="Select * From 成績(jī)表 Where 語(yǔ)文 Between [low] And
[high]" cmd.CommandText = SQL Dim param(1) ' 定義兩個(gè)含有兩個(gè)元素的數(shù)組陣列 param(0) = Val(Text1.Text) param(1) = Val(Text2.Text) Set rs = cmd.Execute(, param) 以上cmd.Execute語(yǔ)句多了兩個(gè)參數(shù),其意義如下: 參數(shù)1:返回?cái)?shù)據(jù)記錄的條數(shù),若省略,就表示返回所有的數(shù)據(jù)記錄。 參數(shù)2:用來(lái)指定SQL語(yǔ)句的參數(shù)值,應(yīng)該傳人一個(gè)一維數(shù)組。如上例。 帶有參數(shù)的SQL語(yǔ)句的變形: Select * From 成績(jī) Where 語(yǔ)文 Between [low] And [high] Select * From 成績(jī) Where 語(yǔ)文 Between ?And ? 11.8 數(shù)據(jù)環(huán)境與報(bào)表設(shè)計(jì)器 通過(guò)前面的學(xué)習(xí),我們了解到存取數(shù)據(jù)庫(kù)的首要任務(wù),是建立Recordset對(duì)象,然而建立Recordset對(duì)象的方法有許多變化,變化之多,常令初學(xué)者不知所措,而Data
Envionment的主要功能就是把這些讓人眼花繚亂的內(nèi)容集成在一起,一方面提供給用戶(hù)容易操作的可視化環(huán)境,另一方面也提供給數(shù)據(jù)庫(kù)程序一致的界面。 一、 Data
Envionment使用 1.Data
Envionment的添加與設(shè)置 利用Data
Environment打開(kāi)xjgl.mdb的“基本情況表”,那么操作過(guò)程如下: 1)選取Visual Basic菜單的“工程/更多ActiveX設(shè)計(jì)器”,再單擊“Data
Environment”,添加一個(gè)Data Environment到工程中,此時(shí)Data Environment所顯示的窗口如圖11.8-1。Data
Environment默認(rèn)名稱(chēng)為DataEnvironment1,已包含一個(gè)連接對(duì)象Connection1。 2)在Connection1對(duì)象上單擊鼠標(biāo)右鍵,選擇其快捷菜單下的“屬性”命令,接下來(lái)會(huì)出現(xiàn)“數(shù)據(jù)連接屬性”對(duì)話框,然后選取“Provider”選項(xiàng)卡下的“Microsoft
Jet 3.51 OLE DB Provider”,在“連接”選項(xiàng)卡中選“xjgl.mdb”,當(dāng)設(shè)置完成后,單擊“確定”按鈕返回到Data
Environment窗口中。(此設(shè)置過(guò)程與ADODC控件的設(shè)計(jì)界面是相同的)。 3) 在Connection1對(duì)象上單擊鼠標(biāo)右鍵,選擇其快捷菜單下的“添加命令”命令,如圖11.8-2所示,在Connection1下面會(huì)添加一個(gè)Command對(duì)象,其默認(rèn)名稱(chēng)為Command1。 4)在Command1對(duì)象上單擊鼠標(biāo)右鍵,選擇其快捷菜單下的“屬性”命令,接著會(huì)出現(xiàn)“Command1屬性”對(duì)話框,在“通用”選項(xiàng)卡中選取“數(shù)據(jù)庫(kù)對(duì)象”下拉列表中的“表”選項(xiàng),在“對(duì)象名稱(chēng)”
下拉列表中的“基本情況表”,如圖11.8-3所示。 圖11.8-1
Data Environment窗口 圖11.8-2 添加命令窗口 圖11.8-3 Command1屬性窗口 經(jīng)過(guò)以上四個(gè)步驟之后,我們其實(shí)就是建立了一個(gè)Connection對(duì)象和一個(gè)Command對(duì)象,具體設(shè)置如下:
如果我們不使用Data
Environment,而使用ADO來(lái)建立這兩個(gè)對(duì)象,則程序如下: Dim Connection1 As New ADODC. Dim Command1 As New ADODC.Command ConnStr=“Provider=Microsoft.Jet.OLEDB.3.51;Data Source=xjgl.mdb” Connection1.Open ConnStr Set Command1.ActiveConnection=Connection1 Command1.CommandType=adCmdTable Command1.CommandText=“基本情況表” 就像ADODC不具備顯示數(shù)據(jù)的能力一樣,Data Envionment也不具備顯示數(shù)據(jù)的能力,如要顯示數(shù)據(jù),就必須使用數(shù)據(jù)識(shí)別控件。以DataGrid為例:
運(yùn)行該程序,DataGrid就會(huì)顯示出來(lái)自DataEnvionment1/Command1的數(shù)據(jù)了。 2.多數(shù)據(jù)來(lái)源與DataMember屬性 若與ADODC相比,在設(shè)置過(guò)程中數(shù)據(jù)識(shí)別控件與Data Envionment連接所需要的屬性比ADODC的連接多了一個(gè)DataMember屬性。 其實(shí)DataMember在Data Envionment中十分重要,因?yàn)樵谕粋€(gè)Data
Envionment下可以建立多個(gè)Connection對(duì)象,而同一個(gè)Connection對(duì)象下又可以建立多個(gè)Command對(duì)象,通過(guò)Command對(duì)象可以存取不同的數(shù)據(jù)源。下面接著上面的例子來(lái)說(shuō)明。 1)在Connection1對(duì)象上單擊鼠標(biāo)右鍵,選擇其快捷菜單下的“添加命令”命令,在Connection1下面會(huì)添加一個(gè)Command對(duì)象,其默認(rèn)名稱(chēng)為Command2。 2) 在Command2對(duì)象上單擊鼠標(biāo)右鍵,選擇其快捷菜單下的“屬性”命令,接著會(huì)出現(xiàn)“Command2屬性”對(duì)話框,在“通用”選項(xiàng)卡中選取“數(shù)據(jù)庫(kù)對(duì)象”下拉列表中的“表”選項(xiàng),在“對(duì)象名稱(chēng)”
下拉列表中的“成績(jī)表”。 3)先選取DataGrid對(duì)象,然后單擊其DataMember屬性,這時(shí)可以看到可選擇的屬性值多了一個(gè)Command2,如圖11-24。如果將DataGrid的DataMember屬性設(shè)置為Command2,那么程序運(yùn)行后,DataGrid將會(huì)顯示“成績(jī)表”的內(nèi)容。 圖11.8-4 屬性窗口 其實(shí),除了可以添加Command
對(duì)象外,也可添加Connection對(duì)象,添加方法是在DataEnvionment1上單擊鼠標(biāo)右鍵,選擇快捷菜單下的“添加連接”命令,即可添加另
一個(gè)Connection對(duì)象,其默認(rèn)名稱(chēng)為Connection2,這樣Connection2下又可以添加多個(gè)Command對(duì)象用于分別連接不同的
數(shù)據(jù)表。 二、報(bào)表設(shè)計(jì)器 Data Envionment的另一個(gè)重要用途是為“報(bào)表設(shè)計(jì)器”提供數(shù)據(jù)源。VB6所提供的報(bào)表設(shè)計(jì)器稱(chēng)為Data Report,但必須在專(zhuān)業(yè)版或企業(yè)版中才有這個(gè)控件。新建工程后,選取VB菜單的“工程/添加Data
Report”命令,即可添加Data Report至工程中。 我們把xjgl.mdb數(shù)據(jù)庫(kù)下的“基本情況表”輸出成報(bào)表,下面介紹報(bào)表制作過(guò)程: 1)首先添加一個(gè)Data Envionment到工程中,并連接好xjgl.mdb數(shù)據(jù)庫(kù)下的“基本情況表”。 2)添加一個(gè)Data Report到工程中,Data Report的結(jié)構(gòu)如圖11-25所示,含有報(bào)表標(biāo)頭、頁(yè)標(biāo)頭、細(xì)節(jié)、頁(yè)注腳和報(bào)表注腳五個(gè)帶區(qū),在屬性窗口可以發(fā)現(xiàn)除Data
Report是一個(gè)對(duì)象外,Data Report上面的每一個(gè)帶區(qū)也各是一個(gè)對(duì)象。 圖11.8-5 Data Report對(duì)象窗口 3)利用屬性窗口設(shè)置Data Report對(duì)象的DataSource屬性值為DataEnvionment1,DataMember屬性值為Command1。 4)從Data Envionment中拖動(dòng)對(duì)象Command1到Data Report的細(xì)節(jié)帶區(qū),出現(xiàn)如圖11-26所示結(jié)果。 圖11.8-6
Data Report的細(xì)節(jié)帶區(qū)窗口 5)在窗體上放置一個(gè)命令按鈕,并在其Click事件中輸入如下代碼: DataReport1.Show 執(zhí)行該程序并單擊命令按鈕,則會(huì)出現(xiàn)Data Report的報(bào)表預(yù)覽窗口。 |
|