第7章 數(shù)據(jù)庫應(yīng)用程序設(shè)計(jì)方法
本章以成績查詢系統(tǒng)為例,較系統(tǒng)地介紹了數(shù)據(jù)庫應(yīng)用程序的開發(fā)模式和基本方法。通過本章學(xué)習(xí),你應(yīng)該能夠達(dá)到如下學(xué)習(xí)目標(biāo):
1.掌握VB數(shù)據(jù)庫應(yīng)用程序的基本框架,以及SQL操縱數(shù)據(jù)的方法,能夠編寫Insert、Update、Delete和Select語句,并將這些語句嵌入到VB程序中。
2.理解使用VB數(shù)據(jù)庫引擎操縱數(shù)據(jù)庫的方法,以及VB數(shù)據(jù)對象及數(shù)據(jù)庫訪問機(jī)制,能夠運(yùn)用ADO對象進(jìn)行程序設(shè)計(jì)
3.了解使用Excel輸出報(bào)表的方法。
4.了解“成績查詢”程序的設(shè)計(jì)過程,能夠讀懂并完善這類程序的部分語句。
一、相關(guān)知識
數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫系統(tǒng)的概念在數(shù)據(jù)庫領(lǐng)域中是比較常見的。所謂數(shù)據(jù)庫是計(jì)算機(jī)內(nèi)有組織、可共享的數(shù)據(jù)的集合。而數(shù)據(jù)庫管理系統(tǒng)是用戶與操作系統(tǒng)之間的數(shù)據(jù)管理軟件,數(shù)據(jù)庫在建立、運(yùn)行和維護(hù)時(shí)由數(shù)據(jù)庫管理系統(tǒng)統(tǒng)一管理、統(tǒng)一控制。在數(shù)據(jù)庫管理系統(tǒng)之上有應(yīng)用系統(tǒng),例如用VB開發(fā)數(shù)據(jù)庫應(yīng)用程序,以供終端用戶使用。因此,比較嚴(yán)格的說法是數(shù)據(jù)庫系統(tǒng)由數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫應(yīng)用系統(tǒng)、數(shù)據(jù)庫管理員和用戶構(gòu)成。但有時(shí)數(shù)據(jù)庫管理系統(tǒng)和數(shù)據(jù)庫系統(tǒng)常?;煊?。
1.關(guān)系數(shù)據(jù)庫概念
數(shù)據(jù)庫根據(jù)數(shù)據(jù)組織方式的不同而有所不同,即數(shù)據(jù)模型不同,較常見的數(shù)據(jù)模型有層次模型、網(wǎng)狀模型、關(guān)系模型。根據(jù)數(shù)據(jù)模型的不同,所建立的數(shù)據(jù)庫結(jié)構(gòu)也不同。目前使用最普遍的是關(guān)系數(shù)據(jù)庫。所謂關(guān)系數(shù)據(jù)庫是把數(shù)據(jù)組成一張或多張二維表格,即關(guān)系表,多張彼此關(guān)聯(lián)的表格群組形成數(shù)據(jù)庫,即關(guān)系數(shù)據(jù)庫。
在關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)以數(shù)據(jù)二維表的形式存在,如表7.1、7.2所示。數(shù)據(jù)二維表(簡稱數(shù)據(jù)表)由行和列組成,數(shù)據(jù)表中每一行稱為一個(gè)記錄,每一列稱為一個(gè)字段,如表7.1中有4條記錄,每條記錄包含5個(gè)字段:學(xué)號(Sno),姓名(Sname),性別(Sex),年齡(Sage),所在系(Sdept)。關(guān)系模型要求每個(gè)字段數(shù)據(jù)類型相同,并且是不可再分的,如果某個(gè)字段能唯一地標(biāo)識這條記錄,則這個(gè)字段就被稱為主關(guān)鍵字或主碼(Key),如上表的學(xué)號(Sno)。
表7.1 學(xué)生基本情況表(Student)
Sno | Sname | Sex | Sage | Sdept |
0001 | 王磊 | 男 | 19 | 計(jì)算機(jī)科學(xué)系 |
0002 | 劉進(jìn) | 女 | 20 | 中文系 |
0003 | 李波 | 男 | 21 | 土建系 |
0004 | 張建國 | 女 | 20 | 計(jì)算機(jī)科學(xué)系 |
表7.2 選課表(sc)
Sno | Cno | grade |
0001 | 001 | 82 |
0002 | 002 | 76 |
0003 | 003 | 80 |
0004 | 002 | 95 |
在關(guān)系數(shù)據(jù)庫中,我們用到了數(shù)據(jù)庫、數(shù)據(jù)表、字段、記錄等概念,小結(jié)如下:
? 關(guān)系:從用戶觀點(diǎn)看,一個(gè)關(guān)系對應(yīng)通常的一張二維表。
? 記錄:二維表中的每一行數(shù)據(jù)為一個(gè)記錄。如表7.1有4條記錄
? 字段:每一列稱為一個(gè)字段,每個(gè)字段都有一個(gè)名稱。如學(xué)生姓名是一個(gè)字段,它的名稱是Sname。
? 數(shù)據(jù)表:記錄的集合構(gòu)成一個(gè)二維表格,稱為數(shù)據(jù)表。如表7.1。
? 數(shù)據(jù)庫:多個(gè)相關(guān)的數(shù)據(jù)表的集合,構(gòu)成數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫都已文件的形式存儲在磁盤上
? 主碼:如果某個(gè)字段能夠唯一地標(biāo)識一條記錄,則稱此記錄為主碼,如表7.1中的學(xué)號(Sno)。
? 索引:索引是對某字段的內(nèi)容按大小進(jìn)行排序,然后對該字段索引進(jìn)行快速檢索便可找到相應(yīng)記錄。
2.數(shù)據(jù)庫管理系統(tǒng)概念
數(shù)據(jù)庫管理系統(tǒng)(DBMS)是用戶與操作系統(tǒng)之間的數(shù)據(jù)管理軟件系統(tǒng),對數(shù)據(jù)庫的各種管理與操作都是由數(shù)據(jù)庫管理系統(tǒng)進(jìn)行的,用戶在對數(shù)據(jù)庫進(jìn)行操作時(shí),只需向DBMS提出“需要做什么”的請求,不必了解“如何做”。DBMS根據(jù)用戶的請求,完成對數(shù)據(jù)庫的實(shí)際操作。主要包括:創(chuàng)建數(shù)據(jù)庫中的各種對象,如創(chuàng)建新表、索引等;對數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行增加、修改和刪除等;數(shù)據(jù)庫的事務(wù)管理、并發(fā)控制、故障恢復(fù)、完整性控制及安全控制等。
數(shù)據(jù)庫管理系統(tǒng)與數(shù)據(jù)庫是密不可分的,每一種數(shù)據(jù)庫都由某一特定的數(shù)據(jù)庫管理系統(tǒng)進(jìn)行管理,所以數(shù)據(jù)庫管理系統(tǒng)也常常被稱為數(shù)據(jù)庫系統(tǒng)。常用的數(shù)據(jù)庫系統(tǒng)有Access、SQL Server 、Oracle等。
3.SQL語言
SQL是結(jié)構(gòu)化查詢語言(Structure Query Language)的縮寫。它是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,簡捷易學(xué),功能強(qiáng)大。它可以實(shí)現(xiàn)數(shù)據(jù)查詢、數(shù)據(jù)更新等多種功能。
(1)數(shù)據(jù)查詢
SQL提供SELECT語句進(jìn)行數(shù)據(jù)庫的查詢,其一般格式為:
SELECT字段列表FROM表名WHERE條件GROUP BY 分組字段
HAVING分組條件ORDER BY字段
說明如下:
? 字段列表:字段可以是一個(gè)字段,也可以是多個(gè)字段,若是多個(gè)字段,字段之間用逗號分隔,如果要選擇某個(gè)表中的所有字段,可用“*”代替。
? FROM子句:用于指定一個(gè)或多個(gè)表,如果所選的字段來自不同的表,則字段名前應(yīng)加表名前綴。
? WHERE子句:用于構(gòu)造查詢條件。
? GROUP BY與HAVING子句:共同用于對結(jié)果集進(jìn)行分組過濾處理。它能把在指定字段列表中有相同值的記錄合并成一條記錄。
例1.查詢student表(表7.1)中的所有學(xué)生的學(xué)號與姓名。
分析:查詢所有學(xué)生的學(xué)號與姓名,無查詢條件。
SQL語句如下:
SELECT Sno,Sname FROM student
查詢結(jié)果如表7.3所示。
表7.3 查詢結(jié)果
Sno | Sname |
0001 | 王磊 |
0002 | 劉進(jìn) |
0003 | 李波 |
0004 | 張建國 |
此操作在關(guān)系數(shù)據(jù)庫中稱投影操作,投影操作返回二維表格的若干列。
例2.查詢student表中所有計(jì)算機(jī)科學(xué)系的學(xué)生。
分析:應(yīng)用WHERE子句構(gòu)造查詢條件,使其滿足能夠查詢Student表中所有計(jì)算機(jī)科學(xué)系的學(xué)生。
SQL語句如下:
SELECT * FROM WHERE student.Sdept= '計(jì)算機(jī)科學(xué)系'
查詢結(jié)果如表7.4所示。
表7.4 查詢結(jié)果
Sno | Sname | Sex | Sage | Sdept |
0001 | 王磊 | 男 | 19 | 計(jì)算機(jī)科學(xué)系 |
0004 | 張建國 | 女 | 20 | 計(jì)算機(jī)科學(xué)系 |
此操作在關(guān)系數(shù)據(jù)庫中稱選擇操作,選擇操作返回二維表格的若干行。
例3.查詢選修了002號課程的學(xué)生姓名和成績,并按由高到低排列。
分析:學(xué)生姓名在表student中,成績在表sc中,顯然所需信息需要從兩個(gè)表中獲得。按分?jǐn)?shù)由高到低排列需要用關(guān)鍵字DESC,反之,用ASC(默認(rèn)) 。
SQL語句如下:
SELECT student.Sname,sc.grade
FROM student,sc
WHERE student.Sno=sc.Sno and sc.Cno= "002"
ORDER BY grade DESC
查詢結(jié)果如表7.5所示。
表7.5查詢結(jié)果
Sname | grade |
張建國 | 95 |
劉進(jìn) | 76 |
此操作在關(guān)系數(shù)據(jù)庫中稱連接操作,連接操作是通過某個(gè)關(guān)鍵字將兩個(gè)表連接起來。本例中是通過Sno關(guān)鍵字將表student和sc連接起來。在SELECT語句中,特別要指明某個(gè)字段來源于哪個(gè)表,如student.Sname表示Sname這個(gè)字段來源于student表。
(2)數(shù)據(jù)更新
SQL中數(shù)據(jù)更新包括插入數(shù)據(jù)、修改數(shù)據(jù)和刪除數(shù)據(jù)三種語句。
①插入數(shù)據(jù)
語句格式為:
INSERT INTO 表名(屬性列)VALUES(值列)
例4.在選課表中插入一條選課信息:學(xué)號為0005的學(xué)生選了003號課程,成績?yōu)?5。
SQL語句如下:
INSERT INTO sc(Sno,Cno,grade)VALUES('0005', ' 003', '85')
②修改數(shù)據(jù)
語句格式為:
UPDATE 表名SET 列名=值,××× WHERE 條件
注意:如果條件為空,則修改所有的字段。
例5.將學(xué)生表中學(xué)號為0002的學(xué)生名字改為趙月,所屬系改為“電子信息工程系”。
SQL語句如下:
UPDATE student SET Sname='趙月', Sdept= '電子信息工程系'WHERE Sno= '0002'
③刪除數(shù)據(jù)
語句格式為:
DELETE FROM 表名 WHERE 條件
注意:如果條件為空,則刪除所有的記錄。
例6.刪除學(xué)號為0002的同學(xué)選002號課的記錄。
SQL語句如下:
DELETE FROM sc WHERE sno= '0002'and cno='002'
例7.刪除計(jì)算機(jī)科學(xué)系同學(xué)所有的選課記錄。
在選課表sc中,沒有計(jì)算機(jī)科學(xué)系的信息,必須在student表中查詢。這時(shí)需要用到謂詞IN所帶的子查詢。
SQL語句如下:
DELETE FROM sc WHERE sno IN
(SELECT Sno FROM student WHERE Sdept = '計(jì)算機(jī)科學(xué)系'
二、本章重要知識點(diǎn)
1.三種數(shù)據(jù)庫類型
VB 將數(shù)據(jù)庫分為三種類型:本地?cái)?shù)據(jù)庫、外部數(shù)據(jù)庫、遠(yuǎn)程數(shù)據(jù)庫
本地?cái)?shù)據(jù)庫:主要指Microsoft Access數(shù)據(jù)庫。
外部數(shù)據(jù)庫:是指采用ISAM的數(shù)據(jù)庫,如dBase,F(xiàn)oxpro,Paradox,Excel等。
遠(yuǎn)程數(shù)據(jù)庫:指SQL Server Oracle DB2等大型數(shù)據(jù)庫。
2.VB數(shù)據(jù)庫訪問機(jī)制
VB 通過數(shù)據(jù)引擎訪問數(shù)據(jù)庫
數(shù)據(jù)引擎:數(shù)據(jù)庫應(yīng)用程序?qū)儆谝环N非常典型的前后臺軟件結(jié)構(gòu),前臺是我們的VB程序,后臺則是數(shù)據(jù)庫管理系統(tǒng),如SQI Server。而前后臺通信的主要機(jī)制稱為數(shù)據(jù)庫引擎。
常用的數(shù)據(jù)庫引擎有三種:Jet引擎、ODBC、OLE DB。
3.數(shù)據(jù)對象
VB采用面向?qū)ο蠹夹g(shù),將三種數(shù)據(jù)庫引擎封裝成三種訪問數(shù)據(jù)庫的對象,即DAO、RDO、ADO。
DAO對象:可以使用Jet引擎和ODBC兩種方式訪問數(shù)據(jù)庫。
RDO對象:一般采用ODBC訪問數(shù)據(jù)庫。
ADO對象:主要采用OLE DB訪問數(shù)據(jù)庫,也支持ODBC訪問,但需要經(jīng)過OLE DB轉(zhuǎn)接。
4.ADO對象模型
ADO 是一種基本OLE DB 的 模型。
ADO對象模型共包含7個(gè)對象。它們是Connection、Command、Recordset、Field、Parameter、Property和 Error。其中最常用的是前4個(gè)對象。
5. 數(shù)據(jù)庫應(yīng)用程序的大致框架
將SQL語句嵌入到VB語言中,采用ADO數(shù)據(jù)對象模型開發(fā)數(shù)據(jù)庫應(yīng)用程序。
(1) 連接后臺數(shù)據(jù)庫
在VB應(yīng)用程序中主要用Connection對象連接后臺數(shù)據(jù)庫,基本方法是:
l 首先聲明并創(chuàng)建對象
Dim ADOcn As Connection '聲明對象
Set ADOcn = New Connection '創(chuàng)建新對象
或上述兩條語句直接寫成
Dim ADOcn As New Connection
l 建立數(shù)據(jù)庫連接
一般通過下列語句完成與數(shù)據(jù)庫的連接“
ADOcn.Open 連接字符串
語句中的連接字符串可以通過自動(dòng)生成“連接字符串 “的方法來實(shí)現(xiàn),見教材184-185頁。
(2)對數(shù)據(jù)庫中的數(shù)據(jù)表進(jìn)行更新操作
更新操作包括增加、刪除和修改,這些語句的特點(diǎn)是沒有返回的結(jié)果集,它們僅僅向數(shù)據(jù)庫發(fā)出一條更新命令??梢岳?span lang="EN-US">Connection對象的execute方法來完成。語法如下:
ADOcn.Execute SQL語句字符串
為了提高程序的可讀性和易維護(hù)性,通常采用如下方法完成上述操作:
'聲明一個(gè)字符串變量
Dim strSQL As String
'拼寫Insert、Delete、Updata結(jié)構(gòu)化查詢語句
例如:
strSQL = "Delete From 學(xué)生成績表"
strSQL = strSQL + "Where 學(xué)號=" + "'+Combol.Text+'"
'執(zhí)行SQL語句
ADOcn.Execute strSQL
(3) 對數(shù)據(jù)表進(jìn)行查詢(Select)操作
記錄集Recordset對象是數(shù)據(jù)表的查詢結(jié)果,通過使用Recordset進(jìn)行Select語句的操作?;臼褂梅椒ㄈ缦拢?/span>
'聲明一個(gè)新的Recordset對象
Dim ADOrs As New Recordset
與ADO鏈接對象建立關(guān)聯(lián)
ADOrs.ActiveConnection = ADOcn
'執(zhí)行Select操作
ADOrs.Open "Select*From 學(xué)生成績表"
'關(guān)閉記錄集對象
ADOrs.Close
(4)顯示記錄集中的數(shù)據(jù)
①在TextBox中顯示
Text1.Text = ADOrs.Fields("學(xué)號")
②讀取到變量中
Dim strNo As String
strNo = ADOrs.Field("學(xué)號")
Text1.Text = strNo
③在Grid控件中以二維表的形式顯示
采用MSFlexGrid控件進(jìn)行顯示,一般步驟是:
l 清空數(shù)據(jù)
l 設(shè)置標(biāo)題欄
l 打開記錄集
l 使用循環(huán)將記錄集中的數(shù)據(jù)添加到Grid中去。
例8.假設(shè)在d盤根目錄中存在一個(gè)名為“student.mdb”的Access數(shù)據(jù)庫,其中包含一張名為“學(xué)生基本情況”的數(shù)據(jù)表,表中存放了學(xué)生的基本信息,如圖1所示。
現(xiàn)在要求利用VB編寫一個(gè)數(shù)據(jù)庫記錄增加程序,程序的運(yùn)行界面如圖2所示,基本邏輯是:分別在Text1、Text2、Text3中輸入學(xué)號、姓名、籍貫信息,然后點(diǎn)擊“保存”按鈕(Command1)將該記錄添加到數(shù)據(jù)庫中。如果數(shù)據(jù)庫中已經(jīng)存在相同的學(xué)號信息,則程序應(yīng)提示用戶“記錄已存在,請重新輸入”,并將焦點(diǎn)置于Text1上,等待用戶修改或重新輸入。當(dāng)點(diǎn)擊退出按鈕(Command2)時(shí)關(guān)閉本窗體。
圖1用Access創(chuàng)建的學(xué)生基本情況數(shù)據(jù)表
圖2 查詢程序運(yùn)行界面
Private ADOcn As New Connection
Private Sub Form_Load()
[1] "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\student.mdb"
End Sub
Private Sub Command1_Click()
Dim strSQL As [2]
Dim ADOrs As New Recordset
ADOrs.ActiveConnection = [3]
strSQL = "Select * from 學(xué)生基本情況一覽表 Where 學(xué)號=" + " ' " + [4]+ " ' "
ADOrs.Open [5]
If Not ADOrs.EOF Then
MsgBox "學(xué)號已經(jīng)存在,請重新輸入!", vbOKOnly, "信息提示"
Text1.SetFocus
Else
strSQL = "Insert Into 學(xué)生基本情況一覽表(學(xué)號,姓名,籍貫) "
strSQL = strSQL + " Values ( '" + Text1 + " ','" + Text2 + "','" + Text3 + " ')"
[6] .Execute strSQL
MsgBox "添加成功!", vbOKOnly, "信息提示"
[7]
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
答案:
[1] ADOcn.Open
[2] string
[3] ADOcn
[4] Text1
[5] strSQL
[6] ADOcn
[7] End If
6.數(shù)據(jù)控件、可視化數(shù)據(jù)管理器、報(bào)表設(shè)計(jì)的基本概念
見教材。