第十一章 Visual Basic与数据库
( 2学时 )
11.1 数据库概念
11.2 数据库管理器
11.3 数据控件
*11.4 ADO数据控件
*11.5 结构化查询语言 (SQL)
*11.6 报表制作
11.7 错误处理
11.1 数据库概念数据库 表数据库就是一组排列成易于处理和读取的相关信息的集合。
关系模型已经成为数据库设计事实上的标准。
关系型数据库模型学号 姓名 性别 专业 出生年月
9 9 0 0 0 1 万林 男 物理 8 2 - 1 - 2 1
9 9 0 0 0 2 庄前 女 物理 8 2 - 9 - 2 1
9 9 0 1 0 1 丁保华 男 数学 8 2 - 4 - 4
9 9 0 1 0 2 姜沛棋 女 数学 8 1 - 1 2 - 2
9 9 0 1 0 3 朱克良 男 数学 8 2 - 1 0 - 1
9 9 0 2 0 1 程玲 女 计算机 8 2 - 1 1 - 1 4
9 9 0 2 0 2 黎敏艳 女 计算机 8 3 - 2 - 2 1
9 9 1 1 0 3 章万京 男 电气 8 2 - 6 - 3
9 9 1 1 0 4 陈友良 男 电气 8 3 - 5 - 5
记录字段主键按学号索引一个数据库可以由多个表组成,表与表之间可以用不同的方式相互关联。若第一个表中的一条记录内容与第二个表中多条记录的数据相符,但第二个表中的一条记录只能与第一个表的一条记录的数据相符,这样的表间关系类型叫做一对多关系。
若第一个表的一条记录的数据内容可与第二个表的多条记录的数据相符,反之亦然,这样的表间关系类型叫做多对多关系。
基本情况表 学生成绩表学号 姓名 学号 课程 成绩
99 0 00 1 万林 99 0 00 1 数学 85
99 0 00 2 庄前 99 0 00 1 外语 90

一对多关系可以将一个或几个表中的数据构成记录集 Recordset对象,记录集也由行和列构成,它与表类似。
学号 课程 成绩
990001 数学 85
学号 姓名 性别 专业 出生日期
990001 万林 男 物理 82-1-11
990002 庄前 女 物理 82-9-21
。。。 。。。 。。。 。。。 。。。
( 表一 )
数据库记录集学号 姓名 专业 课程 成绩
990001 万林 物理 数学 85
990002 庄前 物理 外语 90
。。。 。。。 。。。 。。。。。
在 VB中数据库内的表格不允许直接访问,而只能通过记录集对象进行记录的操作和浏览,因此,记录集是一种浏览数据库的工具 。
数据库 记录集记录集类型说 明
T a bl e
是表格直接显示的数据。它比其他类型记录集处理速 度快,内存开销较大。
Dy n a s e t
一个或者几个表中的记录的引用,动态集和产生动态集的基本表可以互相更新。是最灵活的,功能最强的记录集。
S n a pS h o t
数据库一瞬间的状态,显示的数据是静态、只读状态,内存开销最少。
11.2 数据库管理器
VB的数据库管理器 (Visdata.exe)可用于 管理数据库。在 VB开发环境内单击外接程序菜单中的可视化数据管理器命令可打开可视数据管理器。
数据库管理器使用小结:
1.建立新表:
鼠标右键单击数据库窗口,弹出菜单,选择对应命令。
2,打开,删除表,修改表结构和建立表间的关联等操作:
右键单击数据库窗口内的表名,弹出菜单,选择对应命令 。
3,编辑记录:
双击表名,打开表格输入窗,编辑,增删记录 。
字段名 类 型 宽 度 字段名 类 型 宽 度学号 T e x t 6 专业 T e x t 10
姓名 T e x t 10 出生年月 D a t e 8
性别 T e x t 2 照片 B i n a r y
建立 Student.mdb 数据库,所含学生基本情况表结构如下:
11.3 数据控件工具箱内数据控件图标形状画在窗体上的外观
11,3.1 数据控件注,RecordSource属性可以是数据库中的单个表名,也可以是使用 SQL查询语言的一个查询字符串。如果连接的是单表数据库,则 DatabaseName
属性应设置为数据库文件所在的子目录名,而具体文件名放在
RecordSource属性中。
能够利用三种记录集对象访问数据库中的数据,连接方法,连接属性 D at a 控件属性说明
Co n n ec t 指定数据控件所要连接的数据库类型。
D at ab as e N ame 指定具体使用的数据库文件名,包括所有的路径名。
Rec o r d So u r ce 确定具体可访问的数据,这些数据构成记录集对象。
Rec o r d T y p e 确定记录集类型。
数据库 记录集绑定控件姓名 庄前性别 女数据控件只能连接数据库产生记录集,不能显示记录集中的数据,要显示记录集中的数据必须通过能与它绑定的控件来实现。
常用绑定控件绑定控件具有 DataSource 和 DataField两个重要属性,其作用如下:
属 性 绑定控件绑定属性说明
D a t a S o u r c e 指定一个有效的数据控件连接到数据库上。
D a t a F i e l d 设置数据库有效的字段与绑定控件建立联系。
Data控件、记录集与绑定控件记录集学号 姓名 专业 课程 成绩
990001 万林 物理 数学 85
990002 庄前 物理 外语 90
。。。 。。。 。。。 。。。。。
数据库例 11.2 用一个数据网格控件 MsFlexGrid显示 Student.mdb数据库中基本情况表的内容 。
例 11.1 设计一个 窗体显示在 11.2节中建立的的 Student.mdb数据库中基本情况表的内容 。
属性:
Rows,Cols (网格的行或列数)
FixedRows,FixedCols (不可卷动的行或列数)
11.3.2 数据控件的事件事 件 说 明
R e p o s i t i o n
发生在一条记录成为当前记录后,这个事件中显示当前指针的位置。
V a i l d a t e
移动记录指针前、修改与删除记录前或卸载含有数据控件的窗体时触发该事件。参数 S a v e 可判断绑定控件内的数据是否发生变化。
11.3.3 数据控件的常用方法 方 法 说 明
R e f r e s h 激活对数据控件属性的改变,使对数据库的操作有效。
U p d a t e C o n t r o l s 将数据从数据库中重新读到被数据控件绑定的控件内。
U p d a t e R e c o r d 将绑定控件内的数据写入到数据库中而不触发数据控件的 V a i l d a t e 事件。
Refresh
11.3.4 记录集的属性与方法
1 属性学号 姓名 专业 课程 成绩
990001 万林 物理 数学 85
990002 庄前 物理 外语 90
。。。 。。。 。。。 。。。 。。。
990010 黎明 建筑 建筑学 90
Eof
Bof
BookMark
RecordCount
2 记录集的方法学号 姓名 专业 课程 成绩
990001 万林 物理 数学 85
990002 庄前 物理 外语 90
。。。 。。。 。。。 。。。 。。。
990010 黎明 建筑 建筑学 90
MoveLast
MoveFirst
MoveNext
MovePrevious
FindFirst,FindLast,FindNext,FindPrevious 方 法 可 在 指 定 的
Dynaset或 Snapshot类型的记录集对象中查找 。
Seek方法在 Table表中查找 。
Nomarch属性可判定是否找到 。
Data1.Recordset,FindFirst "姓名 =' 黎明 ' "Nomarch=False
例 11.3 在窗体上用 Move方法代替数据控件对象的 4个箭头的操作。
11.3.5 记录的增删改操作学号 姓名 专业 课程 成绩
990001 万林 物理 数学 85
990002 庄前 物理 外语 90
990010 黎明 建筑 建筑学 90
Data1.Recordset,AddNew 增加记录数据库
UpData填入新数据编辑记录 删除记录
调用 Edit方法 。 调用 Delete方法 。
给各字段赋值 。 移动记录指针 。
调用 Update方法 。
例 11.4 对数据库提供增、删、改和查找功能。
11.4 ADO数据控件
ADO是 Microsoft处理数据库信息的最新技术,它是一种 ActiveX对象,
采用了被称为 OLE DB的数据访问模式 。 它是数据访问对象 DAO,远程数据对象 RDO和开放数据库互连 ODBC三种方式的扩展 。 ADO对象模型更为简化,不论是存取本地的还是远程的数据,都提供了统一的接口

11.4.2 使用 ADO数据控件
11.4.1 ADO对象模型在使用 ADO数据控件前,必须先通过“工程 /部件”菜单命令选择
,Microsoft ADO Data Control 6.0(OLE DB)”选项,将 ADO数据控件添加到工具箱。 ADO数据控件与 Visual Basic的内部数据控件很相似,它允许使用 ADO数据控件的基本属性快速地创建与数据库的连接。
工具箱内
ADO控件图标形状画在窗体上的外观能够利用三种记录集对象访问数据库中的数据,连接方法:
ADO 控件连接设置连接属性 ADO 控件属性说明
Co n n ec t i o n St ri n g
包含了用于与数据源建立连接的相关信息
( ADO 控件没有 D at ab as e N a me 属性)。
Rec o r d So u r ce
确定具体可访问的数据,这些数据构成记录集对象 Rec o r d s e t 。
连接操作 ------鼠标右击 ADO控件,选择快捷菜单,ADODC属性”命令,打开 ADO控件属性页窗:
单击选定选定数据库选定设置完成后,ADO控件的 ConnectionString属性为:
Provider=Microsoft.Jet.OLEDB.3.51; Persist Security Info=False; Data
Source=Student.mdb
RecordSource属性为:基本情况(表)
ADO控件的的其他操作与 Data控件相同。
11.4.3 ADO控件上绑定控件的使用网格控件比较网格控件 分 类 功能说明
M S F l e xGr i d 标准 不能进行编辑,有图形功能。
M S H F l e xGr i d O L E D B 不能进行编辑,可分层处理网格,有图形功能。
D a t a G r i d O L E D B 可以进行编辑操作,显示文本。
MSFlexGrid
MSHFlexGrid
DataGrid
MSChart
DataComboDataList
例 11.5
11.4.4 使用数据窗体向导通过数据窗体向导能建立一个访问数据的窗口 。 在使用前必须执行,
外接程序 /外接程序管理器,命令,将,VB 6数据窗体向导,装入到,
外接程序,菜单中 。
步骤 1:执行,外接程序,菜单中的,数据窗体向导,命令步骤 2:选择数据库类型。
数据库步骤 3:选择具体的数据库文件。
步骤 4:设置应用窗体的工作特性。
步骤 5:选择记录源(所需要的实际数据)。
步骤 6:选择所需要的操作按钮。 例 11.6
11.5 结构化查询语言 (SQL)
11.5.1 结构化查询语言结构化查询语言 SQL是操作数据库的工业标准语言。在 SQL语言中,指定要做什么而不是怎么做。不需要告诉 SQL如何访问数据库,只要告诉
SQL需要数据库做什么。
利用 SQL,可以确切指定想要检索的记录以及按什么顺序检索。可以在设计或运行时对数据控件使用 SQL语句。用户提出一个查询,数据库返回所有与该查询匹配的记录。
结构化查询语言常用 SQL 命令 描 述
C R E A T 创建新的表、字段和索引
D E L E T E 从数据库表中删除记录。
S E L E C T 在数据库中查找满足特定条件的记录。
U P D A T E 改变特定记录和字段的值。
常用 SQL 命令子句 描 述
F R O M 用来为从其中选定记录的表命名。
W H E R E 用来指定所选记录必须满足的条件。
G R O U P B Y 用来把选定的记录分成特定的组。
H A V I N G 用来说明每个组需要满足的条件。
O R D E R B Y 用来按特定的次序将记录排序。
合计函数 描 述
A V G 用来获得特定字段中的值的平均数
C O U N T 用来返回选定记录的个数
S U M 用来返回特定字段中所有值的总和
M A X 用来返回指定字段中的最大值
M I N 用来返回指定字段中的最小值
11.5.2 使用 SELECT语句查询
1.使用 SELECT语句从数据库中的获取数据称为查询数据库,查询数据库通过使用 SELECT
语句 。 常见的 SELECT语句形式为:
Select 字段表 From 表名 Where 查询条件 Group By 分组字段 Order By
字段 [Asc|Desc]
可以在设计或代码中对数据控件的 RecordSource属性设置 SQL语句,也可将 SQL语句赋予对象变量 。
在建立 SQL语句时,如果需要通过变量构造条件,则需要在应用程序中将变量连接到 SELECT语句 。 例如:
"Select * From 基本情况 Where 专业 =' " & Text1 & " ' "
例 11.7 将例 11.4中的查找功能改用 SQL语句处理 。
例 11.8 用 SQL语句从两个数据表中选择数据构成记录集 。
例 11.9 用 SQL指令按专业统计 Student.mdb数据库各专业的人数 。
例 11.10在 ADO数据控件上使用 SQL语句 。 将例 11.8中的 Data控件改用
ADO数据控件,用 SQL语句从 Student.mdb数据库的两个数据表中选择数据构成记录集 。
例 11.11设计一个窗体,计算 Student.mdb数据库内学生成绩表中每个学生的平均成绩,产生姓名,平均成绩和最低成绩三项数据,按平均成绩升序排列数据,并用该数据作图 。
*2,使用 UPDATE语句修改记录
UPDATE创建一个更新查询来按照某个条件修改特定表中的字段值 。 其语法如下:
UPDATE [表集合 ] SET [表达式 ] WHERE [条件 ]
例 11.11a 本例把学生平均成绩字段的值增加了 10%,并刷新网格 。
*3,使用 DELETE语句查询可以创建删除查询来删除 FROM子句中列出的、满足 WHERE子句的一个或多个表中的记录,其语法所示如下:
DELETE [表字段 ] FROM [表集合 ] WHERE [条件 ]
例 11.11b删除例 11.11a所产生 temp表中平均成绩 <90的全部记录,并刷新网格 。
*11.5.3 使用对象变量访问数据库
DAO对象定义了一个可编程的对象集合。可按下列方法定义数据库对象和记录集对象,不必在窗体上放置数据控件方 法 说 明
D i m d b A s D at ab as e
Se t d b = O p e n D at ab as e ( 数据库 )
打开数据库,返回一个
D at ab as e 类型的对象 db 。
D i m rs A s R ec o rd s e t
Se t rs = d b,O p e n R ec o r d s e t ( 记录源 )
返回一个记录集对象 rs 。
要想在程序中使用 DAO对象,必须先为当前工程引用 DAO对象的数据库引擎库。
引用方式:执行工程菜单的引用命令,启动引用对话框,在清单中选取
,Microsoft DAO 3.51 Object Library”项目。
例 11.11e 使用 DAO模型访问数据库,约束绑定控件。
记录集的字段对象 可以使用如下几种方法获取:
Recordset.Fields(“字段名称,),Recordset(“字段名称” )
Recordset.Fields(“数字,),Recordset(“数字,)
在 DAO中记录集对象为对象变量,故字段可用 rs(j)表示。
例 11.11c使用 DAO模型访问数据库,用学号查找学生的记录。
使用 DAO模型访问数据库的例题。
例 11.11d 使用 DAO模型访问数据库,分页显示基本情况表的记录。
本程序通过 Bookmark属性设置当前记录的书签,用于当前页上记录的定位。
*11.5.4 ADO对象使用 ADO对象访问数据库比 DAO对象模型更为简化,不论是存取本地的还是远程的数据,都提供了统一的接口 。
ADO 的连接方法方 法 说 明
D i m d b A s C o n n ec t i o n
S e t d b = N ew C o n n ec t i o n
d b,O p e n 数据源连接字符串连接数据源。
返回一个连接对象 db 。
D i m rs A s R ec o rd s e t
S e t rs = N ew R ec o rd s e t
rs,O p e n 数据源,连接对象,指针,锁类型打开记录集。
返回查询结果。
11.6 报 表 制 作数据报表设计器属于 ActiveX Designer组中的一个成员,在使用前需要执行,工程 |添加 Data Report”命令,将报表设计器加入到当前工程中
,产生一个 DataReport1对象,并在工具箱内产生一个,数据报表,标签 。
标签文本图形线条形状函数
“标签,控件在报表上放置静态文本
,文本,控件在报表上连接并显示字段的数据
,图形,控件可在报表上添加图片
,线条,控件在报表上绘制直线
,形状,控件在报表上绘制各种各样的图形外形
,函数,控件在报表上建立公式 。
报表标头区包含整个报表最开头的信息,一个报表只有一个报表头,
可使用,标签,控件建立报表名报表注脚区包含整个报表尾部的信息,一个报表也只有一个注脚区页标头区设置报表每一页顶部的标题信息;页注脚区包含每一页底部的信息;细节区包含报表的具体数据,细节区的高度将决定报表的行高。
例 11.12 建立新工程,在窗体上放置两个命令按钮 。
在当前工程内加入一个 DataEnvironent1对象 。 完成与指定数据库的连接 。 在
Connection1下创建 Command1对象 。
在当前工程中加入报表设计器 DataReport1,设置报表设计器的 DataSource属性为数据环境对象,DataMember属性为 Command1对象 。
将数据环境设计器中 Command1对象内的字段拖动到数据报表设计器的细节区。
使用,标签,控件,在报表标头区插入报表名,页标头区设置报表每一页顶部的标题信息等 。
使用,线条,控件在报表内加入直线,使用,图形,控件和,形状,控件加入图案或图形 。
在命令按钮 Click事件内加入代码 DataReport1.Show显示报表,
DataReport1.PrintReport打印报表。
11.7 错误处理错误处理步骤:
1.用 On Error语句设置错误陷阱,捕捉错误 。
2.编写错误处理程序,根据可预知的错误类型决定采取何种措施 。
捕捉错误示意:
On Error Err对象
Number
错误号其他可根据 Err.Number 的值来编写出错处理程序。
On Error语句有如下几种形式:
(1) On Error Resume Next ─── 忽略错误行,继续执行下一语句 。
(2) On Error GoTo 标号 ─── 使程序转跳到语句标号所指示的程序块 。
(3) On Error GoTo 0─── 不使用错误处理程序块 。
处理方法:
Resume ─── 重新执行引起错误的语句或指令 。
Resume Next ─── 忽略错误行,继续执行下一语句 。
Resume 标号 ─── 忽略错误行,转跳到由 <标号 >指明的语句继续执行
。 若 <标号 >为 0,则表示终止程序执行 。
例 11.13 错误处理的基本方法
Sub OnErrorStatementDemo()
Dim Response,Msg,Style,Title As String
Dim db As Database,rs As Recordset
On Error GoTo ErrorHandler
Set db = OpenDatabase("A:\Student.mdb") ' 打开数据库
Set rs = db.OpenRecordset("基本情况 ") ' 设置记录集… …
Exit Sub ' 正常退出本程序
ErrorHandler,' 错误处理块入口
Style = vbRetryCancel + vbCritical + vbDefaultButton2
Select Case Err.Number
Case 53 ' 出错号 53为文件不存在
Msg = "文件不存在 !"
Response = MsgBox(Msg,Style,"出错提示 ")
If Response = vbCancel Then Exit Sub
Case 71 ' 71号驱动器未准备好
Msg = " A盘未准备好 "
Response = MsgBox(Msg,Style,"出错提示 ")
If Response = vbCancel Then Exit Sub
Case Else ' 当发生其他不可预知的错误,退出本程序
Exit Sub
End Select
Resume ' 再次执行原出错语句
End Sub
例 11.14 下列程序用于处理删除一个已打开的文件所产生的错误 。
Sub ResumeStatementDemo()
On Error GoTo ErrorHandler ' 设置错误陷阱
Open " testfile " For Output As #1
Kill "testfile" ' 企图删除一个打开的文件
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 55 ' 文件已打开错误
Close #1 ' 处理方法:关闭文件
Case Else
… …
End Select
Resume
End Sub
例 11.15 采用忽略错误的方法处理错误 。
Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' 设置错误陷阱
Open " testfile " For Output As #1
Kill " testfile " ' 企图删除一个打开的文件
On Error Goto 0 ' 关闭错误陷阱
On Error Resume Next ' 忽略 Kill "testfile"出错行指令
Err.Clear ' 清除出错号
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 55
Close #1
Case Else… …
End Select
Resume
End Sub
例 11.16 处理被零除,溢出和非法的过程调用三种情况产生的错误 。
Function Divide (numer,denom) as Variant
Const mnErrDivByZero = 11 ' 用于代表被零除
Const mnErrOverFlow = 6 ' 溢出
Const mnErrBadCall = 5 ' 非法的过程调用
On Error GoTo MathHandler
Dim Msg as String
Divide = numer / denom ' 计算
Exit Function
MathHandler:
If Err.Number = MnErrDivByZero Or Err.Number = ErrOverFlow _
Or Err = ErrBadCall Then
Divide = Null '产生错误 则返回 NULL
Else
' 显示意想不到的错误信息。
Msg = "Unanticipated error " & Err.Number
Msg = Msg & "," & Err.Description
MsgBox Msg,vbExclamation
End If
Resume Next ' 不管什么情况,Resume Next
End Function