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