Transcript 第4章窗体
第8章 VBA数据库编程
本章要点:
Docmd对象介绍
VBA数据库访问技术
综合案例
1
8.1 Docmd对象介绍
1. Docmd对象的调用格式
DoCmd.方法名 参数表
Docmd对象常用的操作方法
(1) 打开窗体—OpenForm方法
(2) 打开报表—OpenReport方法
(3) 打开查询—OpenQuery方法
(4) 打开表—OpenTable方法
(5) 打开模块—OpenModule方法
(6) 运行菜单或工具栏命令—RunCommand方法
(7) 运行宏—RunMacro方法
(8) 执行SQL命令—RunSQL方法
(9) 关闭打开的对象—Close方法
(10) 退出 Microsoft Access—Quit方法
2
8.1 Docmd对象介绍
(1) 打开窗体—OpenForm方法
Docmd.OpenForm FormName
[,Vew][,FilterName][,WhereCondition][,DataMode]
[,WindowMode]
参数说明:
DataMode:可选项。窗体数据的输入模式
例8-1
DoCmd.OpenForm "学生基本信息", , , , , acDialog
常量
值
含义
acWindowNormal
0
默认值。正常窗口模式
acHidden
1
隐藏窗口模式
acIcon
2
最小化窗口模式
acDialog
3
对话框框模式
3
8.1 Docmd对象介绍
(2) 打开报表—OpenReport方法
命令格式:Docmd.OpenReport ReportName
[,View][,FilterName][,WhereCondition]
参数说明:
ReportName :字符串表达式,代表当前数据库中报表名称。
View:可选项,打开报表的模式。
例8-2
Docmd.OpenReport "学生信息报表",acViewPreview
常量
值
含义
acViewNormal
0
默认值,打印视图打开
acViewDesign
1
设计视图打开
acViewPreview
2
预览视图打开
4
8.1 Docmd对象介绍
(3) 打开查询—OpenQuery方法
命令格式:Docmd.OpenQuery QueryName [,View]
[,DataMode]
参数说明:
QueryName :字符串表达式,代表当前数据库中查
询名称。
DataMode:可选项。指定三种输入数据模式:
acAdd(追加)、acEdit(编辑)、acReadOnly(只
读)。
例8-3
Docmd.OpenQuery "学生选修成绩",, acReadOnly
5
8.1 Docmd对象介绍
(4) 打开表—OpenTable方法
命令格式:Docmd.OpenTable TableName [,View]
[,DataMode]
参数说明:
TableName:字符串表达式,代表当前数据库中表名
称。
例8-4
DoCmd.OpenTable "学生"
6
8.1 Docmd对象介绍
(5) 打开模块—OpenModule方法
命令格式:Docmd.OpenModule
[ModuleName][,ProcedureName]
参数说明:
ModuleName:字符串表达式,代表当前数据库中模块名
称。若缺省,则在数据库的标准模块中搜索全部由
ModuleName参数指定的过程,并且打开包含这些过程的
模块。
ProcedureName:字符串表达式,代表过程名称。若缺省,
则打开指定模块的通用声明部分。
两个参数至少要设置一个。
例8-5 打开“函数调用”模块的“TryOut”过程。
DoCmd.OpenModule "函数调用", "TryOut"
7
8.1 Docmd对象介绍
(6) 运行菜单或工具栏命令—RunCommand方法
命令格式:Docmd.RunComand Command
参数说明:
Command:固有常量。指定要执行的内置菜单或工
具栏命令。
例8-6 执行Access的“退出”命令
DoCmd.RunCommand acCmdExit
8
8.1 Docmd对象介绍
(7) 运行宏—RunMacro方法
命令格式:Docmd.RunMacro
MacroName[,RepeatCount][,RepeatExpression]
参数说明:
MacroName: 字符串表达式,代表当前数据库中宏名称。
RepeatCount:可选项,数值表达式,是一个整型值,代
表宏将要运行的次数。
RepeatExpression:可选项,用来指定重复运行宏的条件,
当条件为False(0)时,停止运行宏。
例8-7 重复运行“宏1”两次。
DoCmd.RunMacro "宏1", 2
9
8.1 Docmd对象介绍
(8) 执行SQL命令—RunSQL方法
命令格式:Docmd.RunSQL sqlStatement[,Usetransaction]
参数说明:
sqlStatement:字符串表达式,代表操作查询或数据库定
义查询的SQL语句。
Usetransaction:可选项,该参数为True(-1)时,将在事务
处理中包含该查询。否则,不使用事务处理。省缺时,
该值为True。
例8-8 删除“学生”表中性别为男的学生记录。
DoCmd.RunSQL "Delete From 学生 Where 性别='男'"
10
8.1 Docmd对象介绍
(9) 关闭打开的对象—Close方法
命令格式:Docmd .Close [ObjectType][, ObjectName][,
Save]
参数说明:
ObjectType:要关闭的对象类型
ObjectName:字符串表达式,代表要关闭的对象名称。
Save:指定对象关闭时的保存方式。取值为
acSavePrompt(提示保存) 、acSaveYes(保存)。
acSaveNo(不保存)三种。默认值为acSavePrompt。
如果参数都缺省,则关闭当前打开的对象。
例8-9 关闭打开的“学生”表。
DoCmd.Close acTable, "学生"
11
8.1 Docmd对象介绍
(10) 退出 Microsoft Access—Quit方法
命令格式:Docmd.Quit
12
8.2 VBA数据库访问技术
8.2.1 数据库访问技术概述
常用的数据库访问接口技术包括ODBC API、DAO、
ADO等。
3. ADO
ActiveX数据对象(ActiveX Data Object)简称ADO,
是Microsoft公司开发的基于面向对象数据库编程的
新接口。ADO扩展了DAO所使用的对象模型,具有
更加简单、灵活的操作性能。ADO建立在COM体系
结构之上,它的所有接口都是自动化接口,因此在
C++、Visual Basic、Delphi等支持COM的开发语言中
通过接口都可以访问到ADO。ADO是目前使用最普
遍的数据库访问接口技术。
13
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(1) Connection对象
①Connection对象的声明
声明的语法格式如下:
Dim对象变量名As ADODB.Connection
其中,“对象变量名”为任意合法的VBA变量名。
例如:Dim cnn As ADODB.Connection
14
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(1) Connection对象
②Connection对象实例化
在Connection对象声明后,需要实例化Connection对
象后才能使用,例如:
Set cnn=New ADODB.Connection
声明并实例化一个Connection对象,也可写成:
Dim对象变量名As New ADODB.Connection
15
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对
象的使用
(1) Connection对象
③Connection对象的主要属性
Connection对象的主要属性有ConnectionString、
DefaultDatabase、Provider和State。
DefaultDatabase属性:用来指定Connection对象的默认数
据库。
例如,要连接到“学生成绩管理”数据库,可以用如下代码
设置cnn(Connection对象)的DefaultDatabase属性值。
cnn. DefaultDatabase="学生成绩管理.accdb"
16
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对
象的使用
(1) Connection对象
④Connection对象的主要方法
Connection对象的主要方法有:Open、Execute和Close。
说明:以下语法格式中的“对象名”是指已经定义的
Connection对象名。
Open方法:
Open方法用来建立与数据库的连接。语法格式如下:
对象名.Open [ConnectionString] [,UserID][,PassWord][,
Options]
17
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起
使用时,必须先声明并实例化一个记录集对象。
①RecordSet对象的声明
声明格式如下:
Dim 对象变量名 AS ADODB.Recordset
例如:Dim rs As ADODB.Recordset
18
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对
象的使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起使用
时,必须先声明并实例化一个记录集对象。
②RecordSet对象实例化
在RecordSet对象声明后,需实例化RecordSet对象后才能
使用,例如:
Set rs=New ADODB. Recordset
声明并实例化一个Recordset对象也可直接写成:
Dim对象变量名As New ADODB.Recordset
在任何时候,打开的RecordSet对象所指的当前记录均为
整个记录集中的单个记录。
19
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起
使用时,必须先声明并实例化一个记录集对象。
③RecordSet对象的主要属性
BOF和EOF属性
当BOF为True时,记录指针在记录集第一条记录前,
而EOF为True时表明记录指针在最后一条记录后。
20
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对象的
使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起使用时,必
须先声明并实例化一个记录集对象。
③RecordSet对象的主要属性
Filter属性
用于指定记录集的过滤条件,只有满足了条件的记录才会显示
出来,其语法格式为:
记录集对象名.Filter=条件
例8-10 只显示记录集对象rs中部门名称为“财务部”的员工信息。
Dim rs AS New ADODB.Recordset
rs.Filter='部门名称=财务部'
21
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对
象的使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起使用
时,必须先声明并实例化一个记录集对象。
③RecordSet对象的主要方法
Open方法
打开一个记录集,需要使用Open方法,其语法格式如下:
对象名.Open
[Source][,ActiveConnection][,CursorType][,LockType][,Op
tions]
22
8.2 VBA数据库访问技术
例8-11 在“学生成绩管理”数据库中使用RecordSet对象创建“学生”记
录集,在立即窗口中显示学生表的全部记录。
Sub DemoRecordset()
Dim cnn As ADODB.Connection ' 声明连接对象
Dim rst As ADODB.Recordset
' 声明记录集对象
Set cnn = New ADODB.Connection ' 实例化连接对象
Set rst = New ADODB.Recordset ' 实例化记录集对象
cnn.ConnectionString = "Provider= Microsoft.ACE.OLEDB.12.0;" & _
"Persist Security Info=False;User ID=Admin;Data Source = F:\学生成
绩管理.accdb "
cnn.Open ' 打开学生成绩管理数据库
rst.Open "SELECT * FROM 学生", cnn ' 用RecordSet对象的Open方
法打开记录集
Debug.Print rst.GetString ' 在立即窗口打印记录集
rst.Close
' 关闭记录集
Set rst = Nothing
' 回收rs对象的内存占有
cnn.Close
' 关闭连接
Set cnn = Nothing
' 回收cnn对象的内存占有
23
End Sub
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起
使用时,必须先声明并实例化一个记录集对象。
③RecordSet对象的主要方法
AddNew方法
添加新记录需要使用AddNew方法,其语法格式如下:
对象名.AddNew [FieldList][,Values]
24
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对
象的使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起使用
时,必须先声明并实例化一个记录集对象。
③RecordSet对象的主要方法
Update方法
更新记录需要使用Update方法,其语法格式如下:
对象名.Update
更新记录后,应使用Update方法将所添加的记录数据存
储在数据库中。
25
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起
使用时,必须先声明并实例化一个记录集对象。
③RecordSet对象的主要方法
Delete方法
删除记录需要使用Delete方法,其语法格式如下:
对象名.Delete [AffectRecords]
26
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对象的
使用
(2) Recordset对象
当记录集对象(RecordSet)和Connection对象一起使用时,必
须先声明并实例化一个记录集对象。
④对RecordSet对象字段的引用
对记录集进行操作涉及到记录集中字段的引用。访问Recordset
对象中的字段,可以使用字段编号,字段编号从0开始。假设
Recordset对象rs的第一个字段名为“学号”,则引用该字段可以
使用下列多种方法:
rs("学号")
rs(0)
rs.Fields.Item("学号")
rs.Fields.Item(0)
27
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对
象的使用
(3) Command对象
①Command对象的声明
Command对象的声明格式如下:
Dim 对象变量名As ADODB.Command
例如:Dim cmd As ADODB.Command
②Command对象的实例化
在Command对象声明后,需实例化Command对象后才能
使用,例如:
Set cmd=New ADODB.Command
声明并实例化一个Recordset对象也可直接写成:
Dim 对象变量名 As New ADODB.Command
28
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(3) Command对象
②Command对象的实例化
在Command对象声明后,需实例化Command对象后
才能使用,例如:
Set cmd=New ADODB.Command
声明并实例化一个Recordset对象也可直接写成:
Dim 对象变量名 As New ADODB.Command
29
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主
要对象的使用
(3) Command对象
③Command对象的常用属性
Command对象的常用属性如下:
ActiveConnection属性
CommandText属性
State属性
30
8.2 VBA数据库访问技术
8.2.2 ADO对象模型
详细介绍Connection、Command、Recordset三个主要对
象的使用
(3) Command对象
④Command对象的常用方法
Execute方法
对于以记录集返回的Command对象:
Set 记录集对象名
=command.Execute([RecordsAffected][,Parameters][,Opti
ons])
对于不以记录集返回的Command对象:
command.Execute
[RecordsAffected][,Parameters][ ,Options]
31
8.2 VBA数据库访问技术
例8-12在“学生成绩管理”数据库中,使用Command对象获取“学生”记录集。
Sub DemoCommand()
Dim cnn As ADODB.Connection:Dim rst As ADODB.Recordset:Dim cmd As
ADODB.Command
Set cnn = New ADODB.Connection:Set rst = New ADODB.Recordset
Set cmd = New ADODB.Command
cnn.ConnectionString = "Provider= Microsoft.ACE.OLEDB.12.0;" & _
"Persist Security Info=False;User ID=Admin;Data Source = F:\学生成绩管理.accdb "
cmd.CommandText = "SELECT * FROM 学生"
' 使用SQL语句设置数据源
cmd.ActiveConnection = cnn.ConnectionString
Set rst = cmd.Execute
' 使用Execute方法执行SQL语句,返回记录集
Debug.Print rst.GetString
' 在立即窗口中显示记录集全部记录
rst.Close
Set rst = Nothing:Set cmd = Nothing:Set cnn = Nothing
End Sub
32
8.2.3 利用ADO访问数据库的步骤
添加对ADO的引用,只需要依次选择VBE窗口的“工具”|“引用”菜
单命令,在弹出的“引用”对话框中选中“Microsoft ActiveX Data
Objects 2.1 Library”选项(有前置的√),按“确定”按钮即可。
在添加了ADO对象的引用后,在VBA中利用ADO访问数据库的基
本步骤如下:
1. 定义和创建ADO对象实例变量
2. 设置连接参数并打开连接
3. 设置命令参数并执行命令
4. 打开记录集,并操作记录集
5. 收尾工作
33
8.2.3 利用ADO访问数据库的步骤
步骤如下:
1. 定义和创建ADO对象实例变量
一般需要创建Connection对象、Recordset对象、Command对象、
Field对象等。
创建Connection对象 例如:Dim cnn As New ADODB.Connection
创建Recordset对象,例如:Dim rs As New ADODB.Recordset
创建Command对象,例如:Dim cmd As New ADODB.Command
创建Field对象,例如:Dim fd As ADODB.Field
34
8.2.3 利用ADO访问数据库的步骤
步骤如下:
2. 设置连接参数并打开连接
假定cnn为连接对象,与数据库的连接,可以参照以下代码:
cnn.ConnectionString =连接参数
cnn.Open
如果与当前数据库连接则连接参数为
CurrentProject.Connection
35
8.2.3 利用ADO访问数据库的步骤
步骤如下:
3. 设置命令参数并执行命令
一般需要设置命令对象的活动连接、类型及查询等属性。可以参
照以下代码:
With cmd
.ActiveConnection=连接串
.CommandType=命令类型参数
.CommandText=查询命令串
End With
Cmd.Execute
36
8.2.3 利用ADO访问数据库的步骤
步骤如下:
4. 打开记录集,并操作记录集
打开记录集,可以在Connection对象上打开记录集,也可以在
Command对象上打开记录集。
在Connection对象打开记录集可以参照以下代码:
cnn.Open ' 打开一个连接
rs.Open 查询串等参数 ' 打开记录集
在Commnd对象上打开记录集,首先要设置命令对象的活动连接、类型
及查询等属性,可以参照以下代码:
rs.Open cmd,其他参数
操作记录集(检索、追加、更新、删除),一般需要使用DO循环来完
成,可参照代码如下:
Do While Not rs.Eof ' 利用循环遍历整个记录集直到末尾
…
' 安排字段数据的各类操作
rs.MoveNext
' 记录指针指向下一条记录
37
Loop
8.2.3 利用ADO访问数据库的步骤
步骤如下:
5. 收尾工作
在应用程序关闭前,应该关闭并释放分配给ADO对象的资源,操作系统
回收这些资源并分配给其他应用程序。
对象变量名.Close ’关闭对象语法
Set对象变量名=Nothing ’回收资源代码如
通常情况下要关闭并释放对象的有:Connection对象、RecordSet对象、
Command对象等,可参照代码如下:
rs.Close
' 关闭记录集
cnn.Close
' 关闭连接
set rs=Nothing ' 回收rs对象的内存占有
set cmd=Nothing ' 回收cmd对象的内存占有
set cnn=Nothing ' 回收cnn对象的内存占有
38
8.3 综合案例
案例 编写程序完成用户表的信息查询、添加、更新、删除
等操作。
操作步骤如下:
(1) 在学生成绩管理数据库中建立“用户”表,表结构如图 8-2 所示。
图 8-2 用户表结构
(2) 建立用户信息窗体,窗体界面如 8-3 所示。
39
8.3 综合案例
案例 编写程序完成用户表的信息查询、添加、更新、删除
等操作。
(3) 设置属性,如表 8-12 所示。
表 8-12 控件及主要属性设置
控件
名称
属性及属性值
标签
Label1
标题:用户名
标签
Label2
标题:密码
文本框
Tname
名称:Tname
文本框
Tpass
名称:Tpass
命令按钮
CmdAdd
名称:CmdAdd
标题:添加记录
命令按钮
CmdDel
名称:CmdDel
标题:删除记录
命令按钮
CmdFind
名称:CmdFind
标题:查找记录
命令按钮
CmdUpdate
名称:CmdUpdate 标题:更新记录
40
输入掩码:密码
8.3 综合案例
(4) 编写代码如下:
Private cn As New ADODB.Connection
private rs As New ADODB.Recordset
private strName As ADODB.Field, strPass As ADODB.Field
private strSQL As String
‘定义窗体级变量
41
8.3 综合案例
Private Sub CmdADD_Click() ' 追加记录
Dim cmd As New ADODB.Command ' 创建命令对象cmd
Set rs.ActiveConnection = cn
' 设置记录集对象的当前连接
If IsNull(tuser) And IsNull(tpass) Then ' 用户名、密码同时为空
MsgBox "请输入用户名或密码", vbCritical
Else
rs.Open "Select 用户名 From 用户 Where 用户名='" + tuser + "'" ' 打开记录集
If Not rs.EOF Then ' 找到,说明表中已有该用户,
MsgBox "你输入的用户名已存在,不能新增加!", vbCritical
Else
' 没有找到,新增记录
cmd.ActiveConnection = cn
strSQL = "Insert Into 用户(用户名,密码) Values('" + tuser + "','" + tpass + "')"
cmd.CommandText = strSQL
cmd.Execute ' 执行插入记录操作
MsgBox "添加成功,请继续!"
End If
rs.Close
Set rs = Nothing
End If
End Sub
42
8.3 综合案例
Private Sub cmddel_Click() ' 删除记录
Set rs.ActiveConnection = cn
strSQL = "Select 用户名 From 用户 Where 用户名='" + tuser + "'" +_
" and 密码='" + tpass + "'"
' 打开用户名与密码与相应文本框值一样的记录集
rs.Open strSQL, , adOpenKeyset, adLockOptimistic
If rs.EOF Then
MsgBox "你输入的用户与密码不存在,不能删除!", vbCritical
Else
rs.Delete
' 删除
rs.Update
' 更新
MsgBox "删除成功"
End If
rs.Close
Set rs = Nothing
43
End Sub
本章小结
Docmd对象是Access中的重要对象,在VBA编程中通过调
用该对象的内部方法实现对Access数据库的灵活操作,本
章介绍了该对象的调用格式及常用的操作方法。
常用的数据库访问接口技术包括ODBC API、DAO、ADO等,
本章对数据库访问技术进行了概述,介绍了ADO对象模型
中Connection、Command、Recordset三个重要对象,归
纳出利用ADO访问数据库的基本步骤,最后给出一个在
VBA中访问数据库的简单实例。
44
习题
一、选择题
1.ADO对象模型层次中可以打开RecordSet对象的是( )。
A.只能是Connection对象
B.只能是Command对象
C.可以是Connection对象和Command对象
D.不存在
2.ADO对象模型包括Connection、Recordset和( )。
A.Database
B.Workspace
C.Command
D.Fiel
3.某窗体中有一个命令按钮,在窗体视图中单击此命令按钮打开一个
查询,需要执行的操作是( )。
A.OpenqQuery
B.OpenForm
C.OpenTable
D.OpenReport
4.在VBA中,实现窗体打开操作的命令是( )。
A.Do.Openform
B.Docmd.OpenForm
C.OpenForm
D.DoOpen.Form
45
习题
一、选择题
1.ADO对象模型层次中可以打开RecordSet对象的是( )。
A.只能是Connection对象
B.只能是Command
对象
C.可以是Connection对象和Command对象 D.不存在
2.ADO对象模型包括Connection、Recordset和( )。
A.Database
B.Workspace
C.Command
D.Fiel
3.某窗体中有一个命令按钮,在窗体视图中单击此命令按钮打
开一个查询,需要执行的操作是( )。
A.OpenqQuery
B.OpenForm
C.OpenTable
D.OpenReport
4.在VBA中,实现窗体打开操作的命令是( )。
A.Do.Openform
B.Docmd.OpenForm
C.OpenForm
D.DoOpen.Form
46