Access数据库VBA数据库编程.ppt
数据库原理及应用(Access2003),第9章 VBA数据库编程,第9章 VBA数据库编程,9.1 数据库引擎及其接口9.2 数据访问对象 9.2.1 DAO模型结构 9.2.2 主要的DAO对象 9.2.3 利用DAO访问数据库 9.3 ActiveX数据对象 9.3.1 ADO模型结构 9.3.2 主要ADO对象的使用 9.3.3利用ADO访问数据库,第9章 VBA数据库编程,概要介绍:前面已经介绍了模块和VBA程序设计基础知识,包括VBA面向对象程序设计初步知识。实际上,要想快速、有效地管理好数据,开发出更具实用价值的 Access 数据库应用程序,还应当了解和掌握 VBA 的数据库编程方法。本章我们首先介绍数据库访问接口,然后介绍Access支持的DAO和ADO两种数据库编程方法。,9.1 数据库引擎及其接口,VBA是通过Microsoft Jet数据库引擎工具来支持对数据库的访问。所谓数据库引擎实际上是一组动态链接库(DLL),当程序运行时被链接到 VBA 程序而实现对数据库的数据访问功能。数据库引擎是应用程序与物理数据库之间的桥梁,它以一种通用接口的方式,使各种类型物理数据库对用户而言都具有统一的形式和相同的数据访问与处理方法。,9.1 数据库引擎及其接口,在VBA中主要提供了3种数据库访问接口:(1)开放数据库互连应用编程接口(Open Database Connectivity API,ODBC API)。目前 Windows 提供的 32 位 ODBC 驱动程序对每一种客户/服务器 关系型数据库管理系统、最流行的索引顺序访问方法(ISAM)数据库(Jet、dBase、Foxbase 和 FoxPro)、扩展表(Excel)和定界文本文件都可以操作。在 Access 应用中,直接使用 ODBC API需要大量VBA函数原型声明(Declare)和一些繁琐、低级的编程,因此,实际编程很少直接进行 ODBC API的访问。(2)数据访问对象(Data Access Objects,DAO)。DAO 提供一个访问数据库的对象模型。利用其中定义的一系列数据访问对象,例如,Database、QueryDef、RecordSet 等对象,实现对数据库的各种操作。,9.1 数据库引擎及其接口,(3)Active数据对象(ActiveX Data Objects,ADO)。ADO是基于组件的数据库编程接口,是一个和编程语言无关的 COM 组件系统。使用它可以方便地连接任何符合 ODBC 标准的数据库。ADO支持的数据资源范围比DAO广泛。,9.1 数据库引擎及其接口,VBA通过数据库引擎可以访问的数据库有以下3种类型。(1)本地数据库:即Access数据库。(2)外部数据库:指所有的索引顺序访问方法(ISAM)数据库。(3)ODBC数据库:符合开放数据库连接(ODBC)标准的客户/服务器数据库,例如,Oracle、Microsoft SQL Server等。,9.2 数据访问对象,数据访问对象(DAO)包含了很多对象和集合,通过Jet引擎来连接Access数据库和其他的ODBC数据库。DAO模型为进行数据库编程提供了需要的属性和方法。利用DAO可以完成对数据库的创建,如创建表、字段和索引,完成对记录的定位和查询以及对数据库的修改和删除等。数据访问对象完全在代码中运行,使用代码操纵Jet引擎访问数据库数据,能够开发出更强大更高效的数据库应用程序。使用数据访问对象开发应用程序,使数据访问更有效,同时对数据的控制更灵活更全面,给程序员提供了广阔的发挥空间。,9.2 数据访问对象,有图所示为DAO模型分层结构简图。,9.2.1 DAO模型结构,9.2 数据访问对象,DAO对象模型是一个分层的树型结构,它包含了一个复杂的可编程数据关联对象的层次,其中DBEngine对象处于最顶层,它是模型中唯一不被其它对象所包含的数据库引擎本身。层次低的一些对象,如Workspace(s)、Database(s)、QueryDef(s)、RecordSet(s)和 Field(s)是DBEngine对象下的对象层,其下的各种对象分别对应被访问的数据库的不同部分。在程序中设置对象变量,并通过对象变量来调用访问对象方法、设置访问对象属性,这样就实现了对数据库的各种访问操作。,9.2.1 DAO模型结构,9.2 数据访问对象,1.DBEngine对象在DAO的分层结构中可以看到,DBEngine对象是顶层对象,它包含了其他所有的数据访问对象和集合,是惟一不被其他对象所包含的数据库访问对象,实际上,DBEngine 对象就是 Jet 数据库引擎本身。DBEngine对象包含一个Workspace对象集合,该集合由一个或多个Workspace对象组成。如果要建立一个新的 Workspace 对象,则应当使用 CreateWorkspace 方法。该方法的使用语法如下:Set myWsDBEngine.CreateWorkspaces(name,user,password,type),9.2.2 主要的DAO对象,9.2 数据访问对象,其中,myWs是一个Workspace对象。name指定工作区的名字。user设置该工作区的用户名。password 是使用者的密码。type 是用于确定即将创建的 Workspace 对象的类型的可选参数,使用 DAO 可以创建两种类型的 Workspace 对象,即 Jet 型和 ODBC 型,对应这两种类型的常量分别是:dbUseJet 和 dbUseODBC。Dim ws1 As WorkspaceSet ws1=DBEngine.CreateWorkspaces(ws1,zyy,),9.2.2 主要的DAO对象,9.2 数据访问对象,2.Workspace对象在DBEngine对象中有一个Workspace对象集合,该集合包含了当前可使用的Workspace 对象。Workspace为用户定义了一个有名字的会话区。Workspace对象定义了使用何种方式与连接数据。在DAO中,可以使用Microsoft Jet引擎或 ODBCDirect中的任意一种,视数据源而定,而连接方式的实现,则可以通过Workspace 对象来定义。Workspace 对象还提供了事务处理,为保证数据库的完整性提供了支持。引用 Workspace 对象的通常方法是使用 Workspaces 集合,对象在集合中的索引从0开始。在 Workspaces 集合中引用对象,既可以通过在集合中的索引来引用,也可以通过对象的名字来引用。,9.2.2 主要的DAO对象,9.2 数据访问对象,3.Database对象使用DAO编程,Database对象及其包含的对象集是最常用的。Database对象代表了一个打开的数据库,所有对数据库的操作都必须先打开数据库。Workspace对象包含一个Database 对象集合,该对象集合包含了若干个 Database 对象。Database对象包含TableDef、QueryDef、Container、Recordset和Relation 5个对象集合。使用Database对象,可以定义一个Database变量,也可以通过Workspace对象中的Database 对象集来引用。使用 CreateDatabase 方法和 OpenDatabase 方法将返回一个数据库对象,同时该数据库对象自动添加到 Database 对象集合中。,9.2.2 主要的DAO对象,9.2 数据访问对象,3.Database对象使用DAO编程,Database对象及其包含的对象集是最常用的。Database对象代表了一个打开的数据库,所有对数据库的操作都必须先打开数据库。Workspace对象包含一个Database 对象集合,该对象集合包含了若干个 Database 对象。Database对象包含TableDef、QueryDef、Container、Recordset和Relation 5个对象集合。使用Database对象,可以定义一个Database变量,也可以通过Workspace对象中的Database 对象集来引用。使用 CreateDatabase 方法和 OpenDatabase 方法将返回一个数据库对象,同时该数据库对象自动添加到 Database 对象集合中。,9.2.2 主要的DAO对象,9.2 数据访问对象,说明:在使用Database变量时,应当使用Set关键字为该变量赋值。Database对象的常用方法如下:(1)CreateQueryDef方法该方法可创建一个新的查询对象。其使用语法如下:Set querydef=database.CreateQueryDef(name,sqltext)如果name参数不为空,表明建立一个永久的查询对象;若name参数为空,则会创建一个临时的查询对象。sqltext 参数是一个 SQL 查询命令。,9.2.2 主要的DAO对象,9.2 数据访问对象,(2)CreateTableDef方法该方法用于创建一个TableDef对象。其语法格式如下:Set table=database.CreateTableDef(name,attribute,source,connect)其中,table是之前已经定义的表类型的变量。database是数据库类型的变量,它将包含新建的表。name 是设定新建表的名字。attribute 用来指定新创建表的特征。source用来指定外部数据库表的名字。connect 字符串变量包含一些数据库源信息。最后3个参数在访问部分数据库表时才会用到,一般可以默认这几项。,9.2.2 主要的DAO对象,9.2 数据访问对象,(3)Execute方法该方法执行一个动作查询。(4)OpenRecordset方法该方法创建一个新的 Recordset 对象,并自动将该对象添加到Database 对象的Recordset 记录集合中去。其使用语法如下Set recordset=database.OpenRecordset(source,type,options,lockedits)其中,source是记录集的数据源,可以是该数据库对象对应数据库的表名,也可以是SQL 查询语句。如果 SQL 查询返回若干个记录集,使用 Recordset 对象的 NextRecordset方法来访问各个返回的记录集。,9.2.2 主要的DAO对象,9.2 数据访问对象,type 指定新建的 Recordset 对象的类型,共有以下几种类型:dbOpenTable 表类型。dbOpenDynaset 动态集类型。dbOpenSnapshot 快照类型。dbOpenForwardOnly 仅向前类型。dbOpenDynamic 动态类型。一般如果source是本地表,则type的默认值为表类型。,9.2.2 主要的DAO对象,9.2 数据访问对象,options指定新建的Recordset对象的一些特性,常用的有以下几种:dbAppendOnly 只允许对打开表中的记录进行添加,不允许删除或修改记录。这个特性只能在动态集类型中使用。dbReadOnly 只读特性,赋予此特性后,用户不能对记录进行修改或删除。DbSeeChanges 如果一个用户要修改另一个正在编辑的数据,则产生错误。dbDenyWrite 禁止其他用户修改或添加表中的记录。dbDenyRead 禁止其他用户读表中记录。lockedits控制对记录的锁定,一般可以忽略。,9.2.2 主要的DAO对象,9.2 数据访问对象,(5)Close方法 该方法将数据库对象从数据库集合中移去。如果在数据库对象中,有打开的记录集对象,使用该方法会自动关闭记录集对象。关闭数据库对象,也可以使用以下代码:Set database=Nothing,9.2.2 主要的DAO对象,9.2 数据访问对象,4.Recordset对象 Recordset对象是记录集对象,它可以表示表中的记录或表示一组查询的结果,要对表中的记录进行添加、删除等操作,都要通过对Recordset对象进行操作来实现。Recordsets 是包含多种类型的 Recordset 对象的集合。Recordset对象有5种类型,它们是:表、动态集、快照、动态和仅向前,最常用的是前 3 种。,9.2.2 主要的DAO对象,9.2 数据访问对象,5.Field对象 数据库包含的每个表都有多个字段,每个字段是一个Field对象。因此,在记录集Recordset对象中有一个 Field 对象集合,即 Fields,可以使用 Field 对象对当前记录的某一字段进行读取和修改。为了在Fields集合中标识某个Field对象,通常使用以下格式:Fields(fieldname)Field对象的Value属性是Field对象的默认属性,用以返回或设置字段的值。由于该属性是Field对象的默认属性,因此在使用该属性时可以不必显式表示。,9.2.2 主要的DAO对象,9.2 数据访问对象,在VBA中使用DAO,可以分以下几个步骤来操作:(1)首先创建Workspace;(2)然后打开Database;(3)再创建记录集Recordset;(4)最后可以通过这一记录集的属性和方法来访问数据。,9.2.3 利用DAO访问数据库,9.3 ActiveX数据对象,ActiveX数据对象(ActiveX Data Objects,ADO)是Microsoft公司推出的一致数据访问技术(UDA)中的一层接口。它比其他一些对象模型如DAO(Data Access Object)、RDO(Remote Data Object)等具有更好的灵活性,使用更为方便,并且访问数据的效率更高。ADO是基于组件的数据库编程接口,它是一个和编程语言无关的COM组件系统,可以对来自多种数据提供者的数据进行读取和写入操作。需要指出的是,在Access模块设计时要想使用ADO的各个访问对象,首先应该增加一个对 ADO 库的引用。,9.3 ActiveX数据对象,ADO使用了与DAO相似的约定和特性,ADO的对象模型定义了一组可编程的自动化对象。与DAO不同,ADO对象无需派生,大多数对象可以直接创建,没有对象的分级结构。ADO具有非常简单的对象模型,包括以下7个对象:Connection、Command、Parameter、Recordset、Field、Property 和 Error。此外,还包含以下4个集合:Fields、Properties、Parameters和Errors。在ADO模型中,主体对象只有Connection、Command 和Recordset 等3个,其他4个集合对象Errors、Properties、Parameters和Fields分别对应Error、Property、Parameter和Field对象,整个ADO对象模型由这些对象组成。,9.3.1 ADO模型结构,9.3 ActiveX数据对象,ADO的各组件对象之间存在一定的联系,如图9-6所示。了解并掌握这些对象之间的联系形式和联系方法是使用ADO的基础。,9.3.1 ADO模型结构,9.3 ActiveX数据对象,ADO包括Connection、Command、Parameter、Recordset、Field、Property 和 Error等7个对象,如表9-1所示。,9.3.2 主要ADO对象的使用,表9-1 ADO对象,9.3 ActiveX数据对象,在ADO模型中,主体对象只有Connection、Command 和Recordset 等3个。1.Connection对象 Connection对象用于建立与数据源的连接。在客户/服务器结构中,该对象实际上是表示了同服务器的实际的网络连接。建立和数据库的连接是访问数据库的必要一步,ADO 打 开 连 接 的 主 要 方 法 是 通 过Connection 对象来连接数据库,即使用 Connection.Open 方法。另外也可在同一操作中调用快捷方法 Recordset.Open 打开连接并在该连接上发出命令。,9.3.2 主要ADO对象的使用,9.3 ActiveX数据对象,2.Command对象通过已建立的连接发出的“命令”可以以某种方式来操作数据源。一般情况下,命令可以在数据源中添加、删除或更新数据,或者在表中以行的格式检索数据。Command对象体现命令概念。Command对象能够优化命令的执行。,9.3.2 主要ADO对象的使用,9.3 ActiveX数据对象,3.Recordset记录集对象ADO Recordset 对象包含某个查询返回的记录以及那些记录中的游标。我们可以不用显式地打开 Connection 对象的情况下,打开一个 Recordset(例如,执行一个查询)。不过,如果选择创建一个 Connection 对象,就可以在同一个连接上打开多个 Recordset 对象。任何时候,Recordset 对象所指的当前记录均为集合内的单个记录。,9.3.2 主要ADO对象的使用,9.3 ActiveX数据对象,一个典型的ADO应用的步骤是首先使用Connection对象建立与数据源的连接,然后用一个Command对象给出对数据库操作的命令,比如查询数据等,用Recordset对结果集数据进行维护或浏览等操作。对于关系型数据库,通常使用SQL作为Command命令所使用的命令语言。,9.3.3利用ADO访问数据库,9.3 ActiveX数据对象,在应用程序中添加了对ADO对象库的引用后,需先声明一个Connection对象变量,再生成一个Connection对象的实例。例如:Dim answ1 As ADODB.Connection Set answ1=New ADODB.Connection或者合二为一:Dim answ1 As New ADODB.Connection使用ADO编程一般要按照以下几个步骤:(1)定义和创建ADO对象实例变量;(2)设置连接参数并打开连接Connection;(3)设置命令参数并执行命令Command;(4)设置查询参数并返回记录集Recordset;(5)操作记录集(增加、删除、修改、查询);(6)关闭、回收有关对象。,9.3.3利用ADO访问数据库,第9章 VBA数据库编程,总 结本章主要介绍了DAO和ADO两个对象模型,对模型中的主要对象的功能和操作方法进行了详细介绍,并结合实例分别采用DAO和ADO对象模型进行VBA数据库编程。DAO和ADO是VBA数据库编程中对数据操作最常用的两个对象模型,几乎大部分的数据的读取、修改和存储操作都与之息息相关。,谢谢,