第9章 VBA数据库编程
●章前导读
通过本章,你可以学习到:
◎VBA常见操作
◎VBA数据库编程
本章学习流程图
9.1 VBA常用操作方法
1.打开和关闭操作
在VBA中,常用的窗体操作主要有打开窗体Docmd.OpenForm、关闭窗体Docmd.Close。
(1)打开窗体Docmd.OpenForm。
【格式】
表9-1所示为命令参数说明。
表9-1 参数含义
【例9-1】 以对话框形式打开“登录”窗体。
Docmd.OpenForm “登录”,,,,acDialog
(2)关闭窗体Docmd.Close。
【格式】
表9-2所示为命令参数说明。
表9-2 参数含义
【例9-2】 关闭“登录”窗体。
请注意
当“登录”窗体为当前窗体时,可以使用下列语句关闭:
Docmd.Close
(3)打开报表 Docmd.OpenReport。
VBA中同样提供了打开报表Docmd.OpenReport、关闭报表Docmd.Close两种主要操作。
【格式】
表9-3所示为命令参数说明。
表9-3 参数含义
【例9-3】 预览“学生信息”报表。
(4 )关闭报表Docmd.Close。
【格式】
表9-4所示为命令参数说明。
表9-4 参数含义
【例9-4】 关闭“登录”报表。
2.输入框
输入框主要用于显示提示,并要求用户输入文本。它在VBA中以函数形式调用。
【格式】
表9-5所示为命令参数说明。
表9-5 参数含义
图9-1所示为inputbox的一个示例。
图9-1 inputbox示例
调用语句如下:
3.消息框
消息框用于在对话框中显示消息,等待用户单击按钮,并返回一个整型值。
【格式】
表9-6所示为命令参数说明。
表9-6 参数含义
图9-2所示为消息框示例。
图9-2 消息框
调用语句如下:
4.VBA编程数据验证
数据验证主要用于对用户输入的数据进行检验,以便及时发现不符合规则的数据输入,并提示用户更改输入。
【例9-5】 对“登录”窗体的文本框输入进行控制,要求两者均不能为空,且txtPwd只能为数字。
表9-7 常用验证函数
5.计时事件
在VBA中,通过设置窗体的“TimerInterval”属性,并添加“计时器触发”事件,完成定时功能。
【例9-6】 新建一个窗体“timer”,在其中添加一个“名称”为“Label”、“标题”为“欢迎学习ACCESS数据库!”的标签,编程实现字体颜色的改变。
新建窗体,如图9-3所示。
图9-3 “timer”窗体
如图9-4 所示,打开窗体属性窗口,设置“计时器触发”为“事件过程”,设置“计时器间隔”为500 (毫秒)。
图9-4 设置“计时器间隔”和“计时器事件”属性
单击“计时器触发”属性右侧的按钮,打开代码设计窗口,如图9-5所示。
图9-5 代码窗口
输入如下代码:
将“timer”窗体切换至“窗体”视图,如图9-6、图9-7所示。
图9-6 “窗体”视图1
图9-7 “窗体”视图2
9.2 VBA的数据库编程
1.数据库引擎及接口
VBA通过Microsoft Jet数据库引擎工具支持对数据库的访问。所谓数据库引擎,实际上是一组动态链接库( DLL) ,程序运行时被连接到VBA程序,而实现对数据库的数据访问功能。数据库引擎是应用程序与物理数据之间的桥梁,它采用一种通用接口的方式,使各种类型的物理数据库都具有统一的形式和相同的数据访问与处理方法。
VBA中主要提供了3种数据库访问接口:开放数据库互连应用编程接口(ODBC API,Open Database Connectivity API)、数据访问对象(DAO,Data Access Objects)、Active数据对象(ADO, ActiveX Data Objects)。
2.VBA访问数据库的类型
VBA通过数据库引擎可以访问的数据库有以下3种类型。
本地数据库:即Access数据库。
外部数据库:指所有的索引顺序访问方法(ISAM)数据库。
ODBC数据库:符合开放数据库连接(ODBC)标准的C/S数据库。
3.数据库访问对象(DAO)
数据库访问对象(DAO)是VBA提供的一种数据访问接口,包括数据库创建、表和查询的定义等工具,借助VBA代码可以灵活地控制数据访问的各种操作。
Access 2000中的DAO引用方法如下。
进入VBE编程环境,执行“工具”➝“引用”命令,如图9-8所示。
图9-8 菜单命令
如图9-9所示,选中“Microsoft DAO 3.6 Object Library”项,并单击“确定”按钮。
图9-9 “引用”对话框
如图9-10所示,DAO数据模型采用的是层次结构,其中DBEngine (数据库引擎)是最高层次的对象,它包含Error和Workspace两个对象集合。当程序引用DAO对象时,只产生一个DBEngine对象,同时自动生成一个默认Workspace (工作区对象)。表9-8 所示为DAO对象层次说明。
图9-10 DAO对象模型
表9-8 DAO 对象层次说明
通过DAO编程实现数据库访问的一般语句和步骤如下:
4.ADO对象
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码,不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
ADO被设计来继承微软公司早期的数据访问对象层,包括RDO (Remote Data Objects)和DAO(Data Access Objects)。ADO在1996年冬发布。
ADO包含一些顶层的对象,如表9-9所示。
表9-9 ADO 对象说明
在实际编程过程中,使用ADO存取数据的主要对象操作如下。
(1)连接数据源。
利用Connection对象可以创建一个数据源的连接。应用的方法是 Connection 对象的Open方法。
语法:
Dim cnnAs newADODB.Connection '创建Connection对象实例
cnn.Open[ConnectionString][,UserID][,PassWord][,OpenOptions] '打开连接
其中:
ConnectionString:可选项,包含了连接的数据库信息。其中,最重要的就是体现OLE DB主要环节的数据提供者(Provider)信息。不同类型的数据源连接需要使用规定的数据提供者。
数据提供者信息也可以在连接对象Open操作之前的Provider属性中设置。如cnn连接对象的数据提供者( Access数据源)可以设置为:
cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
UserID:可选项,包含建立连接的用户名。
PassWord:可选项,包含建立连接的用户密码。
OpenOptions:可选项,假如设置为adConnectAsync,则连接将异步打开。
此外,利用Connection对象打开连接之前,一般还有一个因素需要考虑:记录集游标位置。它是通过CursorLocation属性来设置的,其语法格式为:
cnn.CursorLocation=Location
其中,Location指明了记录集存放的位置。
(2 )打开记录集对象或执行查询。
执行查询则是对数据库目标表直接实施追加、更新和删除记录操作。一般有3 种处理方法:一种是使用记录集的Open方法,另一种是用Connection对象的Execute方法,第3 种是用Command对象的Execute方法。其中第1种方法只涉及记录集操作,第2 种和第3 种方法则会涉及记录集及执行查询操作。
① 记录集的Open方法
语法:
Dim rs As newADODB.RecordSet '创建RecordSet对象实例
'打开记录集
rs.Open[Source][,ActiveConnection][,CursorType][,LockType][,Options]
其中:
Source:可选项,指明了所打开的记录源信息。可以是合法的SQL语句、表名、存储过程调用或保存记录集的文件名。
ActiveConnection:可选项,合法的已打开的Connection对象变量名,或者是包含Connec-tionString参数的字符串。
CursorType:可选项,确定打开记录集对象使用的游标类型。
需要说明的是,游标类型对打开的记录集操作有很大的影响,决定了记录集对象支持和使用的属性和方法。具体内容可查阅相关资料。
Lo c kType:可选项,确定打开记录集对象使用的锁定类型。
Options:可选项。Long类型的值,指示提供者计算Source参数的方式。
② Connection对象的Execute方法
语法:
Dim cnnAs newADODB.Connection '创建Connection对象实例
... '打开连接等
Dim rs As newADODB.RecordSet '创建RecordSet对象实例
'对于返回记录集的命令字符串
Set rs=cnn.Execute(CommandText[,RecordsAffected][,Options])
'对于不返回记录集的命令字符串,执行查询
cnn.Execute CommandText[ ,RecordsAffected] [ ,Options]
参数说明如下。
CommandText:一个字符串,返回要执行的SQL命令、表名、存储过程或指定文本。
RecordsAffected:可选项,Long类型的值,返回操作影响的记录数。
Options:可选项,Long类型的值,指明如何处理CommandText参数。
③ Command对象的Execute方法
语法:
Dim cnnAs newADODB.Connection '创建Connection对象实例
Dim cmmAs newADODB.Command '创建Command对象实例
... '打开连接等
Dim rs As newADODB.RecordSet '创建RecordSet对象实例
'对于返回记录集的命令字符串
Set rs=cmm.Execute([RecordsAffected][,Parameters][,Options])
'对于不返回记录集的命令字符串,执行查询
cmm.Execute [ RecordsAffected] [ ,Parameters] [ ,Options]
参数说明如下。
RecordsAffected:可选项,Long类型的值,返回操作影响的记录数。
Parameters:可选项,用SQL语句传递的参数值的Variant数组。
Options:可选项,Long类型的值,指示提供者计算Command对象的CommandText属性的方式。
(3)使用记录集。
得到记录集后,可以在此基础上进行记录指针定位、记录的检索、追加、更新和删除等操作。
① 定位记录
ADO提供了多种定位和移动记录指针的方法。主要有 Move 和 MoveXXXX 两部分方法。
语法:
rs.Move NumRecords[,Start] ' rs为RecordSet对象实例
其中:
NumRecords:带符号的Long表达式,指定当前记录位置移动的记录数。
Start:可选。String值或Variant,用于计算书签。还可以使用BookmarkEnum值。
rs.{MoveFirst|MoveLast|MoveNext I MovePrevious}' rs为RecordSet对象实例
其中:
MoveFirst方法将当前记录位置移动到RecordSet中的第一条记录。
MoveLast方法将当前记录位置移动到RecordSet中的最后一条记录。
MoveNext方法将当前记录位置向后移动一条记录(向RecordSet底部移动)。
MovePrevious方法将当前记录位置向前移动一条记录(向RecordSet顶部移动)。
②检索记录
在ADO中,记录集内信息的快速查询检索主要提供了两种方法:Find和Seek。
语法:
rs.Find Criteria[,SkipRows][,SearchDirection][,Start] ' rs为RecordSet对象实例
其中:
Criteria:为String值,包含指定用于搜索的列名、比较操作符和值的语句。Criteria中只能指定单列名称,不支持多列搜索。比较操作符可以是>、<、=、> =、< =、< >或like (模式匹配)。Criteria中的值可以是字符串、浮点数或者日期。字符串值用单引号或“#”标记(数字号)分隔(如“state='WA'”或“state=#WA#”);日期值用“#”标记分隔。
SkipRows:可选项。Long类型的值,其默认值为零,它指定当前行或Start书签的行偏移量以开始搜索。在默认情况下,搜索将从当前行开始。
SearchDirection:可选项。SearchDirectionEnum值,指定搜索应从当前行开始,还是从搜索方向的下一个有效行开始。如果该值为adSearchForward(值1 ) ,不成功的搜索将在RecordSet的结尾处停止。如果该值为adSearchBackward(值-1 ) ,不成功的搜索将在RecordSet的开始处停止。
Start:可选项。Variant书签,用于标记搜索的开始位置。
如语句“rs.Find"姓名LIKE'王*'"”就是查找记录集rs中姓“王”的记录信息,检索成功记录指针会定位到第一条王姓记录。
rs.Seek KeyValues,SeekOption ' rs为RecordSet对象实例
其中:
KeyValues:为Variant值的数组。索引由一个或多个列组成,并且该数组包含与每个对应列作比较的值。
SeekOption:为SeekEnum值,指定在索引的列与相应KeyValues之间进行的比较类型。
③添加新记录
在ADO中添加新记录的方法为AddNew。
语法:
rs.AddNew [FieldList][,Values] ' rs为RecordSet对象实例
参数说明:
FieldList:可选项,为一个字段名,或者是一个字段数组。
Values:可选项,为要添加信息的字段赋的值。如果FiledList为一个字段名,那么Values应为一个单个的数值;假如FiledList为一个字段数组,那么Values 必须也为一个个数和类型与FieldList相同的数组。
④ 更新记录
其实更新记录与记录重新赋值没有太大的区别,只要用SQL语句将要修改的记录字段数据找出来重新赋值就可以了。
⑤ 删除记录
在ADO中删除记录集中的数据的方法为Delete 方法,这与DAO对象的方法相同。但是,在ADO中,它的能力增强了,可以删除一组记录。
通过ADO编程实现数据库访问的一般语句和步骤如下。
(1)在Connection对象上打开RecordSet。
(2)在Command对象上打开Recordset。
5.数据库编程实例
【例9-7】 试编写子过程分别用DAO和ADO完成D盘根目录下“学生管理”数据库中“成绩”表的成绩都加1。
使用DAO编程,代码如下:
使用ADO编程,代码如下:
6.几个特殊函数
几个特殊函数的格式及说明如表9-10所示。
表9-10 几个特殊函数
【例9-8】 对“登录”窗体的文本框控件txtUser进行判断,如果控件值为null,则将其转换为空字符串。
【例9-9】 在一个文本框控件中显示“成绩”表中的成绩大于75的记录的个数。
设置文本框控件的“控件源”属性为:
【例9-10】 在一个文本框控件中显示“成绩”表中的“学号”为“0100000002”的学生的平均成绩。
设置文本框控件的“控件源”属性为:
【例9-11】 在一个文本框控件中显示“成绩”表中的所有记录的总成绩。
设置文本框控件的“控件源”属性为:
课后总复习
一、选择题
1.下列程序的功能是返回当前窗体的记录集:
Sub GetRecNum()
Dim rs As Object
Set rs = 【】
MsgBox rs.RecordCount
End Sub
为保证程序输出记录集(窗体记录源)的记录数,括号内应填入的语句是( )。
A) Me.Recordset B) Me.RecordLocks C) Me.RecordSource D) Me.RecordSelectors
2.下列过程的功能是:通过对象变量返回当前窗体的Recordset属性记录集引用,消息框中输出记录集的记录(即窗体记录源)个数。
Sub GetRecNum()
Dim rs As Object
Set rs = Me.Recordset
MsgBox 【】
End Sub
程序括号内应填写的是( )。
A) Count B) rs.Count C) RecordCount D) rs.RecordCount
3.教师管理数据库有数据表“teacher”,包括“编号”、“姓名”、“性别”和“职称”4 个字段。下面程序的功能是:通过窗体向teacher表中添加教师记录。对应“编号”、“姓名”、“性别”和“职称”的4个文本框的名称分别为:tNo、tName、tSex和tTi-tles。当单击窗体上的“增加”命令按钮(名称为Command1)时,首先判断编号是否重复,如果不重复,则向“teacher”表中添加教师记录;如果编号重复,则给出提示信息。
有关代码如下:
Private ADOcn As New ADODB.Connection
Private Sub Form_Load()
'打开窗口时,连接Access本地数据库
Set ADOcn =______
End Sub
Private Sub Command0_Click()
'追加教师记录
Dim strSQL As String
Dim ADOcmd As New ADODB.Command
Dim ADOrs As New ADODB.Recordset
Set ADOrs.ActiveConnection = ADOcn
ADOrs.Open "Select编号 From teacher Where编号='" + tNo + "'"
If Not ADOrs.EOF Then
MsgBox "你输入的编号已存在,不能新增加!"
Else
ADOcmd.ActiveConnection = ADOcn
strSQL = "Insert Into teacher(编号,姓名,性别,职称)"
strSQL = strSQL + "Values('" + tNo + "','" + tname + "','" + tsex + "','" + ttitles + "')"
ADOcmd.CommandText = strSQL
ADOcmd.Execute
MsgBox "添加成功,请继续!"
End If
ADOrs.Close
Set ADOrs = Nothing
End Sub
按照功能要求,在横线上应填写的是( )。
A) CurrentDB B) CurrentDB.Connention C) CurrentProject D) CurrentProject.Connection
二、操作题
在考生文件夹下有一个数据库文件“samp3.mdb”,里面已经设计好表对象“tAddr”和“tUser”,同时还设计出窗体对象“fEdit”和“fEuser”。请在此基础上按以下要求补充“fEdit”窗体的设计。
(1)将窗体中名称为“1Remark”的标签控件上的文字颜色改为“蓝色”(蓝色代码为16711680),字体粗细改为“加粗”。
(2)将窗体标题设置为“显示/修改用户口令”。
(3)将窗体边框改为“细边框”样式,取消窗体中的水平和垂直滚动条、记录选定器、浏览按钮和分隔线,保留窗体的“关闭”按钮。
(4)将窗体中“退出”命令按钮(名称为“cmdquit”)上的文字颜色改为棕色(棕色代码为128),字体粗细改为“加粗”,并在文字下方加下划线。
(5)在窗体中还有“修改”和“保存”两个命令按钮,名称分别为“CmdEdit”和“CmdSave”,其中“保存”命令按钮在初始状态为不可用,当单击“修改”按钮后,“保存”按钮变为可用,同时在窗体的左侧显示出相应的信息和可修改的信息。如果在“口令”文本框中输入的内容与在“确认口令”文本框中输入的内容不相符,当单击“保存”按钮后,屏幕上应弹出如下图所示的提示框。现已编写了部分VBA代码,请按照VBA代码中的指示将代码补充完整。
要求:修改后运行该窗体,并查看修改结果。
注意:不要修改窗体对象“fEdit”和“fEuser”中未涉及的控件、属性,不要修改表对象“tAddr”和“tUser”。
程序代码只能在“* * * * * Add* * * * * ”与“* * * * * Add* * * * * ”之间的空行内补充一行语句,完成设计,不允许增删和修改其他位置已存在的语句。
Private Sub CmdSave_Click()
If Me! 口令_1 = Me! tEnter Then
DoCmd.RunSQL ("update tUser "& "set 用户名='"& Me! 用户名_1 & "'"&"where用户名='"&Me!用户名_1 &"'")
DoCmd.RunSQL ("update tUser "&"set口令='"&Me! 口令_1&"'"&"where用户名='"&Me! 用户名_1 & "'")
DoCmd.RunSQL ("update tUser "&"set备注='"&Me! 备注_1&"'"&"where用户名='"&Me! 用户名_1 & "'")
Forms! fEdit.Refresh
DoCmd.GoToControl "cmdedit"
CmdSave.Enabled = False
Me! 用户名_1 = Me! 用户名
Me! 口令_1 = Me! 口令
Me! 备注_1 = Me! 备注
Me! tEnter = ""
Me! 用户名_1.Enabled = False
Me! 口令_1.Visible = False
Me! 备注_1.Visible = False
Me! tEnter.Visible = False
Me! Lremark.Visible = False
Else
'* * * * * * * * * * * * * * * * * * * * * Add* * * * * * * * * * * * * * * * * * * * * '
'* * * * * * * * * * * * * * * * * * * * * Add* * * * * * * * * * * * * * * * * * * * * '
End If
End Sub
学习效果自评
本章主要介绍了VBA常见操作及编程,要求考生掌握VBA的简单操作方法及其编程原理。