第10章 Visual Basic資料庫編程
第10章 Visual Basic資料庫編程
- 學習要點
- 了解資料庫的基本概念;
- 掌握數據控制項的使用;
- 掌握利用ADO訪問資料庫;
- 理解報表的製作技術;
了解Visual Basic資料庫編程技術
- 重點、難點
- 數據控制項的使用;
- 利用ADO訪問資料庫;
報表設計。
在計算機應用系統中,對於大量的數據,通常使用資料庫技術來存儲管理要比通過文件來存儲管理有更高的效率。Visual Basic具有強大的資料庫操作功能,提供包含數據管理器(Data Manager)、數據控制項(Data Control)以及ADO(Active Data Object)等功能強大的工具,Visual Basic能夠將Windows的各種先進性與資料庫有機地結合在一起,可以很好地實現資料庫的存取界面,開發出實用便利的資料庫應用程序。
10.1 資料庫概述
10.1.1 資料庫的基本概念
1. 資料庫(Data Base)
大部分應用程序都需要存放大量的數據,並將其組織成易於讀取的格式。這種要求常常通過資料庫管理系統(Data Base Management System,DBMS)來實現。
資料庫是以一定的組織方式存儲在計算機的外存儲器中的、相互關聯的數據的集合。資料庫為滿足某一組織中多個用戶的多種應用而建立。
資料庫具有數據的共享性、數據的獨立性、數據的完整性和數據冗餘少等特點。
資料庫管理系統(DBMS)是管理和維護資料庫的軟體系統,用戶通過DBMS存取資料庫。資料庫管理系統具有數據定義、數據存取、資料庫運行管理以及資料庫的建立、維護和資料庫通信等功能。
資料庫按其結構可分為層次資料庫、網狀資料庫和關係資料庫。其中關係資料庫是目前應用最廣泛的一種資料庫。關係資料庫可採用現代數學理論和方法對數據進行處理,提供了結構化查詢語言SQL。支持關係資料庫的資料庫管理系統稱為關係型資料庫管理系統。目前比較流行的大中型的關係型資料庫管理系統有Oracle、Sybase、Informix、Microsoft SQL Server等,它們功能強大、性能穩定,應用十分廣泛。在Windows環境下Visual FoxPro、Microsoft Access等小型桌面資料庫管理系統應用比較普遍。
2. 關係資料庫
關係資料庫是根據表、記錄和欄位之間的關係進行組織和訪問的一種資料庫,它通過若干個表(Table)來存儲數據,並且通過關係(Relation)將這些表聯繫在一起。
數據表是由行和列組成的數據集合,類似於工作單表。例如,一張表可能包含有關學生的一系列信息,諸如他們的姓名、學號、年齡、性別等,如表10.1所示。
表10.1 學生基本情況表 |
學號 |
姓名 |
性別 |
出生年月 |
政治面貌 |
010001 |
張三丰 |
男 |
1985年7月 |
團員 |
|
010002 |
付春花 |
女 |
1986年10月 |
團員 |
|
010003 |
楊少華 |
男 |
1985年8月 |
黨員 |
|
010004 |
趙文學 |
男 |
1984年2月 |
黨員 |
|
010005 |
于海藍 |
女 |
1984年5月 |
團員 |
所屬院系
信息學院
信息學院
經管學院
經管學院
數學學院
數據表中的列稱為欄位(Field),行稱為記錄(Record)。欄位對應表格中的數據項,每個數據項的名稱稱為欄位名,如學號、姓名等都是欄位名。欄位的取值範圍稱為域,通常用欄位描述表格實體在某一方面的屬性。記錄是欄位值的集合,如姓名為「張三丰」對應的行中所有數據即是一條記錄。記錄中的每個欄位的取值稱為欄位值或分量。記錄中的數據隨著每一行記錄的不同而變化。
多個相互關聯的數據表組成一個資料庫(Database)。例如,一個學生成績管理資料庫(St.mdb)由學生基本情況表(xsjbqk)和學生成績表(xscjb)組成。學生成績表保存了學生的成績,如表10.2所示,這個表中的記錄可以通過學生的學號與學生基本情況表中的記錄關聯起來。
表10.2 學生成績表 |
學號 |
高等數學 |
英語 |
大學計算機基礎 |
010001 |
75 |
81 |
86 |
|
010002 |
87 |
70 |
76 |
|
010003 |
69 |
86 |
90 |
|
010004 |
72 |
78 |
75 |
|
010005 |
71 |
82 |
82 |
程序設計
78
82
80
77
89
10.1.2 結構化查詢語言SQL
資料庫管理系統提供數據操縱語言,以方便用戶和程序員訪問資料庫中的數據,而不必詳細了解資料庫是如何存儲數據或數據存在何處等問題。
SQL(Structure Query Language)語言,即結構化查詢語言,是一種用於資料庫查詢和編程的非過程化高級語言。在查詢數據時,只需指出「要什麼」,而不需要指出如何實現的過程。由於它功能豐富、使用方式靈活、語言簡潔易學,現已成為關係資料庫語言的國際標準。使用SQL可以完成定義關係模式,錄入數據,建立資料庫,查詢、更新、維護資料庫,資料庫重構,資料庫安全控制等一系列的操作要求。
SQL語言由若干個SQL語句組成,用於操作數據及數據表數據。常用的SQL語句有:
- (1)數據定義語句
- CREATE TABLE 創建一個新數據表。
- CREATE INDEX 為表創建一個索引。
CREATE VIEW 創建視圖,即由一個或幾個表定義的虛表。
(2)數據查詢語句
Select語句,從現有的資料庫中一個表或多個關係中檢索數據,它是所有SQL語句中最常用的一個,格式為:
Select <欄位名列表>
Form <表名〉
Where <條件>
[Group By <列名> [Having <條件>]]
[Order By <列名> [ASC | Desc}
其中,「欄位名列表」可以是一個,也可以是多個,多個欄位名之間用逗號分開,當要查詢表中所有列時,則可用「*」代表。「條件」是一個邏輯表達式,SQL條件運算符除了AND,OR,NOT邏輯運算符以及=,<,<=,>,>=,<>比較運算符外,還可以使用BETWEEN(指定運算值範圍)、LIKE(格式相符)和IN(指定記錄)。Group 為分組,Order 為排序。
例如,使用Select語句查詢信息學院學生的姓名、性別:
Select姓名,性別 From xsjbqk Where (所屬院系 = "信息學院" )
Select 語句可以嵌套,也可以進行多表查詢。更多的使用方法請參閱其他有關書籍。
- (3)數據操縱語句
- INSERT語句 用於向數據表中添加一個或多個記錄。
- DELETE語句 用來按照指定條件刪除表中的記錄。
UPDATE語句 用來按照指定條件修改表中的記錄。
- (4)控制語句
- GRANT語句 將一種或多種許可權授予一個或多個用戶。
- REVOKE語句 從一個或多個用戶收回許可權。
- COMMIT語句 提交一個事務。
ROLLBACK語句 撤銷一個事務。
具體的資料庫管理系統,除支持標準的SQL語言外,還常常對SQL進行一些擴充,以方便用戶操作。在Visual Basic 中可以利用數據管理器的SQL語句窗口,直接輸入各種SQL語句,以測試輸入命令的正確性及執行結果。
10.1.3 資料庫管理器
Visual Basic所支持的不同類型的資料庫通常可以通過相關的資料庫管理系統來建立。如果沒有相應的資料庫管理系統,可以使用Visual Basic的數據管理器來管理資料庫。可視化數據管理器(Visual Data Manager),如圖10.1,是Visual Basic提供的一個有關資料庫操作的實用工具,用它可以方便地進行建立資料庫,對數據進行增、刪、修改等操作,而不需要編寫任何代碼。但它不適合應用於大型資料庫中。Visual Basic默認的資料庫是Access資料庫,可以用數據管理器直接創建Access資料庫等。
選擇「外接程序」菜單的「可視化數據管理器」命令可啟動數據管理器,進入資料庫設計界面,如圖10.1。也可以不進入Visual Basic環境,直接運行Visual Basic安裝目錄下的VisData.exe來啟動可視化數據管理器。
圖10.1 數據管理器
選擇數據管理器的「文件」菜單中的「新建」命令或「打開」命令,可新建一個資料庫或打開一個已存在的資料庫,之後,數據管理器出現「資料庫窗口」和「SQL語句」兩個窗口,如圖10.2所示。
數據管理器左面的「資料庫窗口」用於列出指定資料庫包含的表名及結構,在此窗口內可以對錶或記錄進行操作。
要建立資料庫,用滑鼠右鍵單擊資料庫窗口,在彈出菜單中選擇「新建表」命令,則出現如圖10.3所示的「表結構」對話框,根據對話框的提示可建立數據表結構。
圖10.2 新建或打開一個資料庫
圖10.3 「表結構」對話框
數據表的結構建立好以後,就可輸入記錄。在可視化數據管理器內用滑鼠左鍵雙擊出現在資料庫窗口中的表名,打開如圖10.4所示的表格輸入窗口,選擇對應按鈕就可進行添加、編輯、刪除記錄等操作。
圖10.4 表格輸入窗口
10.2 Data控制項
Visual Basic具有資料庫聯接和數據處理功能,因此可以把它作為資料庫應用程序的開發環境。用Visual Basic作為資料庫的開發平台具有簡單、靈活和可擴充性等特點。
Visual Basic提供了兩種與資料庫引擎介面的方法:數據控制項和數據訪問對象。數據控制項只給出有限的不需要編程而能訪問現存資料庫的功能,允許將Visual Basic的窗體與資料庫方便地進行連接。
Data控制項在工具箱中,不需要特殊的步驟加入,但要利用數據控制項返回資料庫中記錄的集合,必須通過它的屬性設置。使用數據控制項,不需要編寫代碼就可以實現以下操作:
(1)與本地或遠程的資料庫建立連接。
(2)對連接的資料庫執行SQL查詢,打開指定的數據表或定義記錄集。
(3)把數據欄位傳送到各種約束控制項,並可在約束控制項中顯示或修改數據欄位的值。
(4)根據約束欄位中數據的變化,添加新記錄或更新資料庫。
(5)捕獲訪問數據時出現的錯誤。
(6)關閉資料庫。
Data控制項可以使用三種類型的Recordset對象中的任何一種來提供對存儲在資料庫中數據的訪問。Recordset(記錄集)作為一個對象,可以是資料庫中的一組記錄,也可以是整個數據表或者表的一部分。記錄集分為三種類型:Table、Dynaset和Snapshot。表類型記錄集(Table)包含表中所有記錄,對數據表中的數據所進行的增加、刪除、修改等操作,直接更新數據。動態集類型記錄集(Dynaset)可以包含來自於一個或多個表中記錄的集合,對這種類型的數據表所進行的各種操作都先在內存中進行,以提高運行速度。以快照類型記錄集(Snapshot)打開的數據表或由查詢返回的數據僅供讀取而不能更改,主要適用於進行查詢工作。
雙擊Data控制項或單擊後在窗體上拖動出控制項的大小,都可以看到Data控制項的外觀,如圖10.5所示。
圖10.5 Date控制項的外觀
10.2.1 常用屬性、方法和事件
Data控制項的屬性有些可用於其他控制項,有些則是Data控制項所特有的。表10.3列出了Date控制項的一些常用屬性。
表10.3 Data控制項的常用屬性 |
屬 性 |
Connect |
|
DatabaseName |
|
RecordSource |
|
RecordsetType |
|
BofAction |
|
EofAction |
|
ReadOnly |
說 明
指定鏈接的資料庫的類型,默認值為Access
用於確定數據控制項使用的資料庫的完整路徑
指定數據控制項所鏈接的記錄來源,可以是數據表名,也可以是查詢名
指定數據控制項存放記錄集的類型,默認為Dynaset
當移動到記錄開始時程序將執行的操作
當移動到記錄結尾時程序將執行的操作
控制能否對記錄集進行寫操作。
1. Data控制項和Recordset對象的方法
(1)AddNew方法:用於添加一個新記錄,新記錄的每個欄位如果有默認值,則以默認值表示,如果沒有則為空白。例如,給Data1的記錄集添加新記錄:
Data1.Recordset.AddNew
(2)Delete方法:用於刪除當前記錄的內容,在刪除後應將當前記錄移到下一個記錄。例如,刪除資料庫中的當前記錄:
Data1.Recordset.Delete
(3)Find方法:用於在記錄集中查找符合條件的記錄。如果條件符合,則記錄指針將定位在找到的記錄上。Find方法包括:
FindFirst方法:查找符合條件的第一條記錄。
FindLast方法:查找符合條件的最後一條記錄。
FindPrevious方法:查找符合條件的上一條記錄。
FindNext方法:查找符合條件的下一條記錄。
例如,在學生基本情況表中查找政治面貌為黨員的第一條記錄:
Data1.Recordset.FindFirst "政治面貌="黨員""
當在數據表類型記錄集進行查找時,還可以使用Seek方法。如果找不到符合條件的記錄,應顯示相關信息以提示用戶,這可通過判斷NoMatch屬性來實現,如:
If Data1.Recordset.NoMatch Then MsgBox "找不到符合條件的記錄"
(4)Move方法:可以使不同的記錄成為當前記錄,常用於瀏覽資料庫中的數據。Move方法包括:Move,MoveFirst,MoveLast,MovePrevious和MoveNext方法。
如果Data控制項定位在記錄集的最後一條記錄上,這時繼續向後移動記錄,就會使得記錄集的EOF屬性值變為True,不能再使用MoveNext方法向下移動記錄,否則會產生錯誤。從而在使用MoveNext方法移動記錄時應該先檢測一下記錄集的EOF屬性:
If Data1.Recordset.EOF = False Then
Data1.Recordset.MoveNext
…… "處理當前記錄
Else
Data1.Recordset.MoveLast
End If
使用MovePrevious方法移動當前記錄同樣會出現與MoveNext方法類似的問題。因此,在使用MovePrevious方法時也應該先檢測一下記錄集的BOF屬性。
(5)Refresh方法:主要用來建立或重新顯示與Data控制項相連接的資料庫記錄集。如果在程序運行過程中修改了數據控制項的DatabaseName,ReadOnly,Exclusive或Connect屬性的設置值,就必須用該方法來刷新記錄集:
Data1.Refresh
(6)Update方法:用於將修改的記錄內容保存到資料庫中。例如,在編輯完當前記錄後,可用Update方法保存最新的修改:
Data1.Recordset.Update
(7)UpdateControls方法:可以從數據控制項的記錄集中再取回原先的記錄內容,即恢復原先的值,取消修改。其格式為:
Data1.UpdateControls
2. Data控制項的事件
除具有標準控制項所具有的事件之外,Data控制項還具有幾個與資料庫訪問有關的特有事件:Reposition事件和Validate事件。
(1)Reposition事件:當用戶單擊Data控制項上某個箭頭按鈕,或者在應用程序中使用了某個Move或Find方法時,一個新記錄成為當前記錄,均會觸發Reposition事件。例如,用這個事件來顯示當前記錄指針的位置的代碼為:
Private Sub Data1_Reposition()
Data1.Caption = Data1.Recordset.AbsolutePosition + 1
End Sub
(2)Validate事件:當某一記錄成為當前記錄之前,或是在Update,Delete,Unload或Close操作之前觸發該事件。Validate事件的格式為:
Private Sub Data1_Validate(Action As Integer, Save As Integer)
其中,Action用來指示引發這種事件的操作,Save用來指定被連接的數據是否進行了修改。例如,在Validate事件觸發時確定記錄內容是否修改,如果不修改則恢復:
If Save = True Then
mb = MsgBox("要保存修改嗎?", vbYesNo)
If mb = vbNo Then
Save = False
Data1.UpdateControls
End If
End If
10.2.2 用控制項顯示數據
在Visual Basic中數據控制項本身只能進行資料庫中數據的操作,不能獨立進行數據的瀏覽,所以需要把具有數據綁定功能的控制項同數據控制項結合起來使用,共同完成數據的顯示、查詢等。Visual Basic中可與數據控制項關聯(或綁定)的控制項有PictureBox,Label,TextBox,CheckBox,Image,ListBox和ComBox控制項等。與Data控制項綁定的控制項也稱為數據感知控制項。
數據感知控制項的DataSource屬性用於指定數據控制項名,DataField屬性用於在下拉列表中選擇要顯示的欄位名稱。在設置了DataSource和DataField屬性之後,當用戶用該控制項來在Recordset中訪問記錄時,就會自動顯示出指定欄位的內容。
【例10-1】 創建一個學生基本情況錄入界面,如圖10.6所示。
圖10.6 學生基本情況表
首先在窗體上增加一個數據控制項Data1,並將其Align屬性設為2-AlignBottom,使之位於窗體的下端,DatabaseName屬性設為St.mdb,RecordSource屬性為「學生基本情況」數據表。然後在窗體上增加一個命令按鈕數組Command1(0)~Command1(3),一個標籤控制項組Label1,一個文本框控制項數組Text1(0)~Text1(5),並將Text1(0)~Text1(5)的DataSource屬性均設為Data1,DataField屬性分別為:學號、姓名、性別、出生年月、政治面貌和所在院系。
編寫程序代碼如下:
Private Sub Data1_Reposition()
Data1.Caption = "記錄" & Data1.Recordset.AbsolutePosition + 1
End Sub
Private Sub Data1_Validate(Action As Integer, Save As Integer)
If Save = True Then
mb = MsgBox("要保存嗎?", vbYesNo, "保存記錄")
If mb = vbNo Then
Save = False
Data1.UpdateControls
End If
End If
End Sub
Private Sub Edit_Click(Index As Integer)
Select Case Index
Case 0 "添加記錄
Data1.Recordset.AddNew
Case 1 "刪除記錄
mb = MsgBox("要刪除嗎?", vbYesNo, "刪除記錄")
If mb = vbYes Then
Data1.Recordset.Delete
Data1.Recordset.MoveLast
End If
Case 2 "更新記錄
Data1.UpdateRecord
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
Case 3 "退出
Unload Me
End Select
End Sub
10.3 ADO數據對象訪問技術
在Visual Basic中,用戶可用的數據訪問介面有三種,即ActiveX數據對象(ADO:Active Data Object)、數據訪問對象(DAO:Data Access Object)和遠程數據對象(RDO:Remote Data Object)。數據訪問介面是一個對象模型,它代表了數據訪問的各個方面。使用Visual Basic 可以在任何應用程序中通過編程來訪問及控制資料庫連接、命令語句並獲得訪問數據。
數據訪問技術在不斷發展,以上三種每一種都代表了該技術的不同發展階段。其中ADO是DAO/RDO 的後繼產物,代表了Microsoft公司未來的數據訪問策略,也是最簡單、最靈活的數據訪問介面,其主要優點是易於使用、速度快、內存支出少,支持建立Clients/Server和基於Web的應用程序的關鍵功能。ADO是實現Internet資料庫訪問的
基礎。
10.3.1 ADO對象模型
在Visual Basic中,提供了Access/Jet,ODBC,Oracle以及SQL Server等OLE DB數據源,ADO訪問數據是通過OLE DB來實現的,它是連接應用程序和OLE DB數據源之間的一座橋樑,提供的編程模型可以完成幾乎所有的訪問和更新數據源的操作。
ADO對象模型定義了一個可編程的分層的對象集合,它支持部件對象模型和OLE DB數據源。ADO對象模型(如圖10.7)主要包括:Connection對象、Command對象和Recordset對象等。
圖10.7 ADO 對象模型
Connection對象用於建立與數據源的連接。連接是交換數據所必需的環境,通過連接,可使應用程序訪問數據源。
Command對象描述將對數據源執行的命令。在建立Command後,可以發出命令操作數據源。一般情況下,命令可以在數據源中添加、刪除或更新數據,或者在表中查詢
數據。
Recordset對象只代表記錄集,是基於某一連接的表或是Command對象的執行結果。Recorset對象是在行中檢查和修改數據最主要的方法,常用於指定行、移動行,添加、刪除或更改行。
使用ADO對象模型的Connection,Command和Recordset對象編程之前,應將ADO函數庫設置為引用項目。這可通過在工程菜單中的引用命令對話框,選擇「Microsoft ActiveX Data Object 2.1 Library」來實現。
10.3.2 使用ADO Data控制項
儘管可以在應用程序中直接使用ADO數據對象,但Visual Basic提供的ADO Data控制項有作為一個圖形控制項的優勢(具有向前、向後的按鈕),以及一個易於使用的界面,從而可以用最少的代碼創建資料庫應用程序。
由於ADO Data控制項屬於ActiveX控制項,每次創建工程時都應選擇「部件」中的「Microsoft ADO Data Control (OLEDB)」複選框,則ADO Data控制項的圖標就會出現在工具箱中。雙擊ADO Data控制項的圖標,或者單擊後在窗體上畫出控制項,都可以在窗體上添加ADO Data控制項,其外觀與Data控制項的外觀相似,默認名稱為Adodc1。
1. ADO Data控制項的屬性
ADO Data控制項的常用屬性如表10.4所示。
表10.4 ADO Data控制項的常用屬性 |
屬 性 |
ConnectonString |
|
RecordSource |
|
CommnadType |
|
Mode |
|
UserName |
|
Password |
說 明
設置到數據源的連接信息,可為OLE DB文件(.udl)、ODBC數據源(.dsn)或連接字元串。
返回或設置一個記錄集的查詢,用於決定從資料庫中查詢什麼信息。
設置或返回RecordSource的類型。
設定對數據的操作範圍。
用戶名稱,當資料庫受密碼保護時,需要指定該屬性。
設置Recordset對象創建過程所使用的口令,當訪問一個受保護的資料庫時是必需的。
ADO Data控制項的大多數屬性可以通過「屬性頁」對話框設置。用滑鼠右鍵單擊ADO Data控制項,在彈出的快捷菜單中選擇「ADODC屬性」,即可打開「屬性頁」對話框,如圖10.8所示。
圖10.8 屬性頁對話框
要使用ADO數據控制項,首先需要連接數據源,也就是設置ConnectionString屬性值。圖10.8連接資源中的三個選項,分別用於OLE DB文件(.udl)、ODBC數據源(.dsn)或連接字元串。例如,選中「使用連接字元串」,單擊「生成」按鈕進入「數據連接屬性」對話框,在「提供者」選項卡中選擇「Microsoft Jet 3.51 OLE DB Provider」,如圖10.9(a)
所示。
單擊「下一步」按鈕,在出現的「連接」選項卡中單擊「…」按鈕,選擇所需資料庫的路徑和名字(如D: Examplest.mdb),在「輸入登錄資料庫的信息」中輸入用戶名稱和密碼,如圖10.9(b)所示。單擊「測試連接」按鈕,當測試成功就單擊「確定」按鈕,則完成了OLE DB數據連接。
(a) (b)
圖10.9 數據連接屬性
另外,利用Windows資源管理器中的新建「Microsoft數據連接」命令,也可以創建一個.udl文件,然後打開該文件的屬性對話框(圖10.9)即可設置OLE DB數據連接。只不過在設置ConnectionString屬性時,需要選中「使用Data Link文件」來指定相應連接資源。
連接到數據源後,就應設置記錄源了,即RecordSource屬性。在屬性頁對話框選擇「記錄源」選項卡,如圖10.10所示。
圖10.10 記錄源
如果選擇命令類型為2-adCmdTable,則設置一個表或存儲過程名為記錄源,如在「表或存儲過程名稱」下拉列表中選擇「學生基本情況(xsjbqkb)」表,Adodc1就連接到St.mdb文件的學生基本情況表。如果選擇1-adCmdText,則將命令文本中輸入的SQL查詢語句作為記錄源。
2. ADO Data控制項的方法、事件
ADO Data控制項對數據的操作主要由Recordset對象的屬性與方法來實現。例如,可用InputBox輸入要移動的記錄數,然後在記錄集中移動當前記錄:
With Adodc1.Recordset
.MoveFirst
MoveNo = InputBox("請輸入移動記錄數:", "移動記錄")
If MoveNo = "" Then End
.Move CLng(MoveNo)
If .BOF Or .EOF Then MsgBox "移動出界"
End With
ADO數據控制項的常用事件主要有:WillMove,WillChangeField,FieldChangeComplete,WillChangeRecord,RecordChangeComplete事件等。
【例10-2】 利用ADO Data控制項重新編寫學生基本情況的輸入程序。
首先,在窗體上添加一個ADO Data控制項Adodc1,並將其連接到數據源st.mdb,並在記錄源選項卡中選擇學生基本情況表,Visible屬性設置為False。添加3個文本框、3個列表框,分別設置其DataSource屬性為Adodc1,DataField屬性為相應的欄位名,並給各欄位框配置合適的標籤。
最後添加命令按鈕Command1(0)~Command1(5),設置各命令按鈕的Caption屬性後,編寫Click事件代碼:
Select Case Index
Case 0 "添加記錄
Adodc1.Recordset.AddNew
Case 1 "刪除記錄
mb = MsgBox("要刪除嗎?", vbYesNo, "刪除記錄")
If mb = vbYes Then
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveLast
End If
Case 2 "更新記錄
Adodc1.Recordset.Update
Case 3 "上一條記錄
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset.BOF Then Adodc1.Recordset.MoveFirst
Case 4 "下一條記錄
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then Adodc1.Recordset.MoveLast
Case 5 "退出
Unload Me
End Select
運行程序,如圖10.11所示。在性別選項中默認為男生,取消選中該複選框則表示女生。政治面貌、所屬院系選項可以從下拉列表選擇輸入,也可直接輸入。
圖10.11 ADO應用界面
10.3.3 高級數據約束控制項
在Visual Basic中,任何具有DataSourec屬性的控制項都可以綁定到一個數據控制項上作為數據感知控制項,除了TextBox,ComboBox控制項等可與資料庫關聯的控制項外,Visual Basic還提供了一些高級約束數據控制項,如DataList, DataCombo, DataGrid,RichTextBox,FlexGrid,MonthView等。加入這些控制項的方法是:使用「工程」菜單中的「部件」命令,然後選擇Microsoft DataGrid Control及Microsoft DataList Control等。
1. 使用DataGrid控制項
DataBrid控制項是一種類似於表格的數據綁定控制項,可以通過行和列來顯示Recordset對象的記錄和欄位,用於瀏覽和編輯完整的資料庫表和查詢。DataGrid控制項為部件中的「Microsoft DataGrid Control (OLEDB)」。
假設現在已經在一個窗體上添加了一個ADO Data控制項,並且設置了與St資料庫的關聯。要使用DataGrid控制項來顯示「學生成績」表中的數據,應首先在窗體上添加一個DataGrid控制項,並設置DataSource屬性為該ADO數據控制項。然後,用滑鼠右鍵單擊DataGrid控制項,選擇「檢索欄位」命令,就會用數據源的記錄集來自動填充該控制項,並且自動設置該控制項的列標頭,如圖10.12所示。
圖10.12 裝載學生成績表的DataGrid控制項
一般情況下,DataGrid控制項的默認設置並不一定合適,可以對該控制項進行手工設置。如從單擊右鍵後彈出的快捷菜單中選擇「編輯」,就可以對欄位進行刪除、插入、追加,以及改變欄位的顯示寬度等操作。通過使用「屬性頁」選項卡則可以更好地設置該控制項的適當屬性,如圖10.13所示。
圖10.13 DataGrid控制項屬性頁
在運行時可以動態地更改網格中的欄位,還可以通過在程序中切換DataSource來察看不同的表。當有若干個ADO Data控制項,每個控制項可以連接不同的資料庫,或設置為不同的RecordSource屬性,可以簡單地將DataSource從一個ADO數據控制項重新設置為另一個ADO數據控制項。
例如,在窗體上添加1個列表框List1、1個ADO Data控制項、1個DataGrid控制項。設置ADO Data控制項的ConnectionString屬性為:
Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=D:Examplest.mdb
ADO Data控制項的RecordSource屬性為該資料庫下某個表,DataGrid控制項的DataSource屬性為Adodc1,List1列表框中添加資料庫的數據表名稱。
編寫List1的Click事件代碼:
Adodc1.RecordSource = "select * from " & List1.List(List1.ListIndex)
Adodc1.Refresh
程序運行後,單擊左邊的數據表名,右邊就會顯示相應記錄,如圖10.14所示。
圖10.14 瀏覽數據表
在應用程序中,利用Rebind方法可以重新生成DataGrid控制項屬性和列,Scroll方法則可用於水平或垂直地滾動DataGrid控制項。例如,單擊DataGrid控制項向右下方滾動:
Private Sub DataGrid1_Click()
DataGrid1.Scroll DataGrid1.VisibleCols-1, DataGrid1.VisibleRows-1
End Sub
DataGrid控制項的常用事件有RowColChange和ButtonClick事件。單擊當前單元的內置按鈕時觸發ButtonClick事件,RowColChange事件是在當前單元改變為其他不同單元時觸發。例如,當網格的行或列變化時,在窗體上顯示當前單元的文字、行和列的信息:
Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
Print DataGrid1.Text; DataGrid1.Row; DataGrid1.Col
End Sub
其中,LastRow用來指定前一行的位置,LastCol用來指定前一列的位置。
2. 使用DataList和DataCombo控制項
DataList控制項、DataCombo控制項所在的部件名為「Microsoft DataList Controls (OLEDB)」。二者與列表框(ListBox)和組合框(ComboBox)相似,所不同的是這兩個控制項不再是用AddItem方法來填充列表項,而是由這兩個控制項所綁定的數據欄位自動填充,而且還可以有選擇地將一個選定的欄位傳遞給第二個數據控制項。
- DataList控制項和DataCombo控制項的常用屬性有:
- · DataSource:設置所綁定的數據控制項。
· DataField:由DataSource屬性所指定用於更新記錄集的欄位,是控制項所綁定的
- 欄位。
- · RowSource:設置用於填充下拉列表的數據控制項。
- · ListField:表示RowSource屬性所指定的記錄集中用於填充下拉列表的欄位。
- · BoundColumn:表示RowSource屬性所指定的記錄集中的一個欄位,當在下拉列表中選擇回傳到DataField,必須與用於更新列表的DataField的類型相同。
· BoundText:BoundColumn欄位的文本值。
【例10-3】 輸入姓名查詢成績信息,如圖10.15所示。
圖10.15 成績查詢界面
在窗體上添加兩個ADO Data控制項、一個DataCombo控制項、一個DataGrid控制項、及兩個命令按鈕和一個標籤,設置控制項的屬性,如表10.5所示。
表10.5 控制項屬性設置值 |
控 件 |
屬 性 |
Adodc1 |
ConnectionString |
|
RecordSource |
||
Visible |
||
Adodc2 |
ConnectionString |
|
RecordSource |
||
Visible |
||
DataGrid1 |
DataSource |
|
DataCombo1 |
RowSource |
|
ListField |
||
BoundColum |
||
Text |
屬 性 值
D:…St.mdb
Select * From 學生成績
False
D:…St.mdb
學生
False
Adodc1
Adodc2
姓名
學號
(空)
編寫命令按鈕的Click事件代碼:
Private Sub CmmList_Click(Index As Integer)
Dim sqlstring As String
Select Case Index
Case 0
sqlstring = "select * from xscjb where " & _
"(((xscjb.學號) ="" & DataCombo1.BoundText & ""))"
Case 1
sqlstring = "select * from xscjb"
End Select
Adodc1.RecordSource = sqlstring
Adodc1.Refresh
End Sub
運行程序時,通過下拉列表選擇用戶名稱後,單擊「查詢」按鈕就會在網格中顯示出指定學生姓名的成績,單擊「全部」按鈕則顯示所有學生的成績。
10.3.4 數據窗體嚮導
如果覺得ADO Data控制項的使用比較麻煩,還可以使用數據窗體嚮導。數據窗體嚮導是ADO Data控制項提供的將一組控制項綁定到某個數據源的簡單方法,包括了用戶界面和所需要的程序代碼。
使用數據窗體嚮導的步驟如下:
(1)添加數據窗體嚮導。數據窗體嚮導是作為外接程序存在的,因此應先將其添加到系統菜單中。單擊外接程序菜單中的「外接程序管理器」選項,在出現的「外接程序管理器」窗口中,選擇「Visual Basic數據窗體嚮導」,選中「載入/卸載」複選框,如圖10.16
所示。
圖10.16 添加數據窗體嚮導
圖10.17 利用嚮導定義窗體
(2)單擊外接程序菜單中出現的「數據窗體嚮導」,打開數據窗體嚮導第一屏「介紹」。單擊「下一步」按鈕,在第二屏「資料庫類型」中選擇Access。
(3)在第三屏「資料庫」中指定資料庫名稱,如D:ExampleSt.mdb。
(4)在「Form」窗口上確定窗體名稱、布局和綁定類型,如圖10.17所示。
(5)在「記錄源」窗口中選擇記錄源,如所需要顯示的欄位。
(6)在「控制項選擇」窗口內選擇所需要的控制項後,單擊「完成」按鈕,就會自動生成窗體,且這個窗體是完全可以運行的。
在使用數據窗體嚮導創建好一個窗體後,用戶可以根據需要修改窗體的布局以及程序代碼,然後再運行應用程序。
10.4 製作報表
對任何一個資料庫應用程序而言,製作報表始終是應用程序所必需的功能。數據報表(DataReport)設計器是Visual Basic 新增的功能,和數據環境(Data Environment)設計器配套使用可以完成大多數類型報表的設計。
10.4.1 數據環境設計器
數據環境設計器為資料庫應用程序的開發提供了一個互動式的、在設計時使用的環境,能夠可視化地創建和修改表、表集和報表的數據環境,為建立連接和定義命令提供了很好的圖形介面。Data Environment設計器保存在.dsr文件中。
在工程菜單中,選擇「更多ActiveX設計器」下級菜單中的「Data Environment」,就會打開數據環境設計器,同時添加了一個數據環境DataEnvironment1,並包含一個連接對象Connection1,如圖10.18所示。
圖10.18 數據環境設計器
1. 創建連接
數據環境中的Connection對象用於管理到資料庫的連接,在Data Environment設計器中定義一個Connection對象的方法與ADO Data控制項的ConnectingString屬性的設置相同。
例如,先將DataEnvironment1名稱設為Students,Connection1對象名稱設為ConnSt。用滑鼠右鍵單擊ConnSt對象,在快捷菜單中選擇「屬性」命令,打開「數據連接屬性」對話框。在「提供者」選項卡中選擇「Microsoft Jet 3.51 OLE DB Provider」,在「連接」選項卡中選擇資料庫名稱,如「D:ExampleSt.mdb」。單擊「測試連接」按鈕,如果測試連接成功則建立了連接。
2. 定義命令
Command對象定義了有關資料庫數據的詳細信息,它可以建立在數據表、視圖、SQL查詢基礎上,也可在命令對象之間建立一定的關係,從而獲得一系列相關的數據集合。命令對象必須與連接對象結合在一起使用。
選中Connection對象(如ConnSt),單擊工具條上的
,或選擇用滑鼠右鍵單擊ConnSt,選擇彈出菜單中的「添加命令」,為數據環境添加一個命令對象Command1。選擇Command1對象,打開其屬性對話框,如圖10.19所示。
圖10.19 Command對象屬性對話框
將Command1對象的名稱改為CommBase,在「資料庫對象」下拉列表中選擇「表」,在「對象名稱」下拉列表框中選擇「學生基本情況」。單擊「確定」按鈕後,在數據環境設置器中就可看到Students的結構,如圖10.20所示。
如果在數據源中選擇SQL查詢作為數據源,則在SQL語句框中選擇合法的SQL查詢,也可以單擊「SQL生成器」啟動查詢設計器來建立一個SQL查詢。
圖10.20 數據環境Students的結構
3. 使用數據環境
在數據環境設計器中創建好了一個數據環境對象以後,就可以利用該數據環境對象訪問資料庫了。例如,可以把CommBase從Data Environment設計器窗口直接拖到一個打開的窗體中,則CommBase中定義的所有欄位都會自動添加到窗體上。並且各控制項的相關屬性也會自動設置,如「學號」標籤的Name屬性為「lblFieldLabel」,顯示「學號」欄位的文本框Name屬性為「txt學號」,DataSource屬性為「Students」等。
運行應用程序,在窗體上就會顯示出第一條記錄的數據。控制項的屬性可以重新設置,也可以只將某個欄位從數據環境設計器窗口拖到窗體中。要想應用程序比較完整,還需在窗體上添加一些命令按鈕,並編寫相應代碼。
例如,在窗體上創建一個命令按鈕Command1,用於移動學生基本情況表中的記錄:
Private Sub Command1_Click()
With Students.rsCommBase
.MoveNext
If .EOF Then .MoveFirst
End With
End Sub
其中,rsCommBase為CommBase對象的記錄集。Recordset對象作為Command對象的屬性,創建一個Command對象後,記錄集的名稱就自動定為「rs+Command對象名」。
另外,也可用代碼來編輯和創建自己的Data Environment對象。例如,定義CommStID為Data Environment對象:
Dim CommStID As Students
10.4.2 報表設計器
在工程菜單中選擇「添加Data Report」,即可在工程中添加一個DataReport對象,並同時打開數據報表設計器,如圖10.21所示。
圖10.21 報表設計器
從圖中可以看出,數據報表設計器由DataReport對象、Section對象和Data Report控制項三部分組成。
1. DataReport對象
DataReport對象與Visual Basic窗體類似,同時具有一個可視的設計器和一個代碼模塊。可以使用設計器創建報表的布局,也可以向設計器的代碼模塊添加代碼,可以採用編程方式調整設計器中包含的控制項或部分格式。
2. Section對象
- 數據報表設計器的每一部分由Section對象表示。設計時,每一個Section對象由一個窗格表示,可以單擊窗格以選擇「頁標頭」,也可以在窗格中放置和定位控制項。還可以在程序中,對Section對象及其屬性進行動態配置。
- · 報表標頭:指顯示在一個報表開始處的文本,如報表標題、作者或資料庫名等。一個報表最多只能有一個報表標頭,而且出現在數據報表的最上面。
- · 頁標頭:指在每一頁頂部出現的信息,如報表的標題、頁數和時間等。
- · 分組標頭/腳註:用於分組的重複部分,每一個分組標頭與一個分組註腳相匹配。
- · 細節:指報表的最內部的重複部分(記錄),與數據環境中最底層的Command對象相關聯。
- · 頁註腳:指在每一頁底部出現的信息,如頁數據、時間等。
· 報表註腳:報表結束時出現的文本,如摘要信息、一個地址或聯繫人姓名等。
3. Data Report控制項
在一個工程中添加了一個數據報表設計器以後,Visual Basic將自動創建一個名為「數據報表」的工具箱,工具箱中列出的6個控制項功能,如表10.6所示。
表10.6 Data Report工具箱中的控制項及其功能 |
控 件 |
RptLabel |
|
RptTextBox |
|
RptImage |
|
RptLine |
|
RptShape |
|
RptFunction |
描 述
用於在報表上放置標籤、標識欄位或Section
顯示所有在運行過程中應用程序通過代碼或命令提供的數據
用於在報表上放置圖形,該控制項不能被綁定到數據欄位
用於在報表上繪製直線,可用於進一步區分Section
用於在報表上放置矩形、三角形、圓形或橢圓
是一個特殊的文本,用於在報表生成時計算數值,如在分組數據的合計等
儘管這6個控制項與窗體的標準控制項類似,但在創建窗體時不能使用這些控制項,同樣也不能將窗體設計器中的控制項用在報表設計器中。
10.4.3 設計報表
數據報表設計器的主要功能就是將數據從資料庫表中提取出來,經過組織後生成一張報表。下面通過學生成績報表的設計說明數據報表設計器的使用方法。
1. 指定數據源
在工程中添加一個數據環境Students,打開數據環境設計器,創建連接對象ConnSt與命令對象CommStID,並通過CommStID屬性頁指定數據源為學生數據表。
用滑鼠右鍵單擊CmmStID對象,在彈出的菜單中選擇「添加子命令」,在數據環境中添加子命令對象CommStCJ,並指定「學生成績」表為數據源。然後在屬性頁的「關聯」選項卡中選中「與父命令對象相關聯」複選框,將「父命令」設置為CommStID,並在關聯定義部分的父欄位、子欄位/參數列表中都選擇「學號」欄位,如圖10.22所示。
圖10.22 「關聯」選項卡
將關係添加到命令對象後,單擊「確定」按鈕關閉對話框,數據環境設計器將這兩個命令對象按分層的方式顯示。
2. 添加DataReport
打開數據報表設計器,將DataReport對象的Name屬性設置為DataReportSt,DataSource屬性為數據環境對象Students(這時數據環境設置器必須是打開的),設置DataMember屬性為CommStID對象。
用滑鼠右鍵單擊DataReportSt對象,選擇快捷菜單中的「檢索結構」命令,出現「用新的數據層次代替現在報表布局嗎?」確認對話框,單擊「是」按鈕,系統將根據數據源定義數據報表中應該有的各個標題欄。例如,如果有分組的話,自動在數據報表設計器中加上分組標頭和註腳。
3. 設計報表界面
可以使用報表設計器中的工具欄來設計報表中的數據項。不過更快捷的方法是直接將數據環境中的各數據欄位拖放到DataReportSt對象的相應區域中。
(1)在頁標頭下,添加一個RptLabel控制項,將Caption屬性設置為「學生成績單」。添加控制項可以使用傳統的方法,也可以通過單擊滑鼠右鍵的方法,在快捷菜單中選擇「插入控制項」。
(2)從數據環境設計器中,將CommStID對象的姓名、學號拖放到分組標頭,則自動出現標籤和文本框。文本框的DataMember和DataField屬性自動為姓名、學號的Command和Field對象。
(3)從數據環境設計器中,依次將高等數學、英語、大學計算機基礎、程序設計欄位拖放到細節區域內。
(4)調整各對象的大小、位置。設置RptStudent屬性的GridX和GridY都為5,將分組標頭、細節中的標籤和文本框對齊,分別設置各標籤及文本框的字體大小等。為了美觀,還可以在分組標頭中添加一條直線,並適當調整各Section對象的寬度,如圖10.23(a)所示。
通過Show方法或改變啟動對象,可以顯示設計好的數據報表,如圖10.23(b)所示。
4. 分組與合計
為了能夠按院系進行成績統計,可先建立一個查詢表,然後進行分組計算、設計報表。在數據環境設計器的CnnSt連接對象中添加一個命令對象CmmCjd,在屬性頁的通用選項卡中選擇「SQL語句」,單擊「SQL生成器」,則出現如圖10.24所示的查詢設計窗口。
圖10.23(a) 設置報表界面
圖10.23(b) 設置報表界面
圖10.24 查詢設計窗口
打開「數據視圖」窗口,將學生成績、學生基本情況表拖放到查詢設計窗口,通過單擊學生成績的「學號」並拖放到學生基本情況的「學號」來建立關聯。選擇要顯示的欄位,包括學生成績的所有欄位、及學生基本情況的姓名、所屬系部。單擊滑鼠右鍵,選擇「運行」命令,在查詢設計窗口中顯示SQL語句和滿足條件的記錄。
關閉查詢設計窗口,返回數據環境設計器。重新打開CmmCjd的屬性頁,在「分組」選項卡中選中「分組命令對象」複選框,在「命令中的欄位」列表框中選擇「所屬系部」,單擊「>」按鈕,如圖10.25所示。
打開「合計」選項卡,單擊「添加」按鈕,將添加的合計名稱改為「高數平均」,在「功能」下拉列表中選擇「平均」,「欄位」下拉列表中選擇「高等數學」。依次添加英語平均、計算機平均、程序設計平均,如圖10.26所示。
單擊「確定」按鈕,返回數據環境設置器。這時數據環境設計器中原來的CmmCjd命令對象被一個名為「CmmCjd分組使用CmmCjd_分組」所替代,該命令對象分為兩部分,一部分是命令對象中的摘要欄位,而另一部分是細節欄位。
圖10.25 「分組」選項卡
圖10.26 「合計」選項卡
添加報表DataReportCj,報表對象的DataMember屬性為CmmCjd_分組,並進行「檢索結構」。適當調整報表界面,並運行程序,其效果如圖10.27所示。
圖10.27 進行分組求平均成績後的界面
除了可以直接顯示資料庫中的數據和合計欄位的值以外,還可以用數據報表設計器為報表在每一頁上添加日期、時間、頁數等信息。
5. 報表列印
可以使用兩種方法列印一個數據報表,一種方法是在預覽數據報表時單擊「列印」按鈕,另一種方法則是在程序中調用PrintReport方法列印報表。
在程序中使用代碼列印數據報表時,既可以在顯示列印對話框後列印報表,也可以不顯示列印對話框而直接列印報表。使用PrintReport方法的格式為:
對象.PrintReport(是否顯示列印對話框,頁面範圍,起始頁,終止頁)
例如,在窗體上添加一個命令按鈕Print,並在其Click事件中輸入:
RptStudent.PrintReport True
在運行時單擊此按鈕,就會出現列印對話框。在列印對話框中用戶可以選擇印表機、列印到文件、要列印的頁面範圍和指定要列印的份數等。
如果不需用戶干預列印,則PrintReport方法也提供不顯示列印對話框的列印,並可選擇要列印的頁面範圍,如:
RptStudent.PrintReport False, rptRangeFromTo, 1, 3
數據報表設計器能夠使用ExportReport方法將報表作為一個大文檔的一部分在Internet上發布,使用一個指定的ExportFormat對象導出報表的文本到一個文件,任何報表都可以作為文本文件或HTML文件導出。
10.4.4 學生成績管理系統的設計
管理信息系統(MIS,Management Information System)是一個由人、計算機、數據和文檔等組成的能進行信息收集、傳遞、存儲、加工、維護和使用的信息系統。它的開發是一個複雜的系統工程,包括需求分析、軟體設計、編程、測試及維護多個階段,這裡的學生成績管理系統僅是一個簡單的實例。
- 學生成績管理系統的設計,包括資料庫設計、主界面設計、菜單設計和功能設計。功能包括輸入、查詢、圖表和列印:
- · 輸入:包括學生基本情況、學生成績單的輸入、修改。
- · 查詢:通過查詢,將滿足查詢條件的信息顯示在窗體上。即可對某個學生進行查詢,也可針對院系、某門課程進行分類查詢、匯總,並將查詢結果寫入隨機文件。
- · 圖表:將滿足分析條件的數據用圖表顯示出來。
· 列印:可以將查詢的結果數據通過報表輸出,也可列印輸出。
資料庫採用Access資料庫,使用可視化數據管理器(VisData)或在Access環境中創建資料庫Students.mdb文件。包括學生基本情況數據表、學生成績數據表、學生數據表,以及通過某些查詢建立的表。
進入系統後應先啟動展示屏幕,以顯示系統名稱、圖標、作者和版本等,並打開資料庫文件,然後進入系統的主界面,通過主界面的菜單進入其他模塊。為了方便用戶使用,可將主界面中的常用菜單項設計為工具欄,如輸入學生基本情況、輸入學生成績單、啟動查詢、顯示圖表等。
各功能模塊的界面設計及代碼編寫,可參考前面有關內容,這裡就不再重複。另外,讀者可以為輸入模塊添加用戶身份的驗證,還可運用多媒體技術進行背景音樂的播放等。
推薦閱讀:
※"資料庫" vs. "數據倉庫": 區別與聯繫
※數據分析在各行各業怎麼用?(二)——「智能」證券報表系統建設
※企名片-5.31日國內外融資事件清單(34筆)
※從國內哪些公司可以買到比較靠譜的 POI 資料庫?
※各大類主要資料庫介紹