Excel VBA 学习总结 - 通用ADO数据访问模型
ADO是基于OLE DB的数据访问技术。它不直接与数据交互,而是把这个任务交给了OLE DB,这么做带来了相当好的可扩展性和适应性。它提供了编程语言和统一数据访问方式;它允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心数据库的连接。由于ADO是基于COM实现的,所以基本上任何语言都可以使用这种数据访问技术,VBA也不例外。 一、ADO对象模型
ADO对象库中主要有9个对象,即:Connection、Command、Recordset、Record、Field、Error、Property、Parameter和Stream。呈现的形式基本是5大可以独立创建的基本对象,4大对象集合,如下图所示。
这9个对象中以Connection、Command、Recordset是最为常用的,很多情况下只需要这三个对象即可完成数据的读取和操作,对于一些很简单的应用,甚至使用它们中的任何一个就可以独立完成任务。下面是各个对象/集合的简略说明: Connection:代表与数据源的连接与操作环境,基本任何的操作都是针对特定的Connection完成的。
常用属性:ConnectionString(最重要),ConnectionTimeout,State(连接的状态),Errors
常用方法:Open,Execute,Close
常用事件:ExecuteComplete,ConnectComplete
虽然Command对象与Recordset对象都可以在需要的时候自己隐式的创建一个Connection对象,但是对于需要多次执行命令或查询的场景,还是需要提供一个公共的Connection对象(这个对象的创建与销毁都是需要时间的)来共用。而且对于同一个连接字符串,ADO会采用连接池(存放Connection对象)的方式减少资源的浪费。
ConnectionString中主要需要设置Provider,Data Source,Initial Catalog,User ID,Password,Integrated Security等值,这些大家应该都很熟悉了。当然有些值(像Provider,Mode这种)也可以在Connection的相关属性中设置。
Connection需要先执行Open方法打开后,才能Execute一些命令,最后需要使用Close关闭(通常为了保险起见,需要先检查State,再关闭)以释放资源。 Command:代表执行的添加、修改,删除、查询数据源的命令。
常用属性:ActiveConnection(设置连接字符串),CommandText(核心属性),CommandType,Parameters(一般是存储过程的参数) 常用方法:CreateParameter,Execute(可以有返回值)。 Recordset:代表执行查询命令后的结果集。
常用属性:ActiveConnection(设置连接字符串),BOF,EOF,CursorLocation,Filter,Sort,State,Fields(返回数据的类型)
常用方法:Open,Close,Move,MoveFirst,MoveNext,Find,NextRecordset
通常配合Range对象的CopyFromRecordset方法获取数据,但是这个方法只能获得值,一般需要匹配Fields属性获取列信息。
如果需要精确控制每行每列的值,可以使用RecordCount,Fields以循环的形式获取结果集中的每个值。
For i = 1 To rst.RecordCount
For j = 0 To rst.Fields.Count - 1
Sheet1.Cells(i + 1, j + 1) = rst.Fields(j) Next j rst.MoveNext Next i
如果返回的结果集为空,则BOF与EOF都为True。通常它们也可以配合Fields精确控制结果集中的每个值。
Find方法基本上是支持与SQL中Where语句基本相同的语法。
Error与Errors:代表与数据源相关的操作的详细错误信息,Errors是Connection对象的属性。
Parameter与Parameters:代表基于参数化查询或存储过程的 Command 对象相关联的参数或自变量,Parameters是Command对象的属性。
Field与Fields:代表使用普通数据类型的数据的列,Fields是Recordset对象的属性。
Property与Properties: 代表ADO 对象的描述或控制对象的行为,分为内置属性(通过对象直接调用)和动态属性(通过集合使用 MyObject.Properties(0) 或 MyObject.Properties(\语法来引用)。
Record:代表记录集中的一行、或文件系统的一个文件或一个目录。 Stream:用于读写以及处理二进制数据或文本流。
二、ADO编程模型
ADO 的目标是访问、编辑和更新数据源,而编程模型体现了为完成该目标所必需的系列动作的顺序。ADO提供类和对象完成以下活动:
? ? ?
连接到数据源 (Connection对象),并可选择开始一个事务。 可选择创建对象来表示 SQL 命令 (Command)。
可选择在 SQL 命令中指定列、表和值作为变量参数 (Parameter)。
?
执行命令 (使用Command、Connection 或 Recordset对象完成)。
? ?
如果命令按行返回,则将行存储在缓存中 (使用Recordset对象)。 可选择创建缓存视图,以便能对数据进行排序、筛选和定位 (使用Recordset对象)。
? ?
通过添加、删除或更改行和列编辑数据 (使用Recordset对象)。 在适当情况下,使用缓存中的更改内容来更新数据源 (使用Recordset对象)。
?
如果使用了事务,则可以接受或拒绝在完成事务期间所作的更改;结束事务 (Connection)。
?
释放相关对象(通常是把对象设为Nothing,别忘了Set关键字)。
不管是否显式的使用了Connection对象,这个对象在整个访问数据库的过程中,是始终存在的。
其实除了连接字符串以及数据库特有的一些特性(比如SqlServer支持存储过程)外,访问各种数据库的基本流程和处理的语句,包括SQL语句都是差不多的。
三、ADO实践 ADO对象创建
对于COM对象的创建方式,大家应该很熟悉了,有两种方式: 后期绑定:使用CreateObject方法。
Dim cnn As Object, rst As Object
Set cnn = CreateObject(\) Set rst = CreateObject(\)
前期绑定:先引用“Microsoft ActiveX Data Objects 2.x Library”(尽量选择高版本),然后直接就可以使用了。下面两种写法都可以:
Dim cnn1 As ADODB.Connection Set cnn1 = New ADODB.Connection
Dim cnn2 As New ADODB.Connection
前期绑定能更好的利用VBE(或者说是VBIDE)的Intellisense。
使用ADO访问各种类型的数据库,基本上除了连接字符串不同,专有特性不同,使用ADO的其它过程基本都差不多,所以下面几种类型数据文件的操作,重点都是介绍各自不同的地方。 使用ADO访问Access中的数据 连接字符串示例:
'Provider和Data Source是必须的 'Mode控制访问数据库方式,本例中是排他访问
Public Const AccessConnection As String = _ \12.0;\
\2007.accdb;\\
\\
在本例中,使用的是Access 2007,所以使用的Provider是“Microsoft.ACE.OLEDB.12.0”。下面是一个伪代码例子,基本上涵盖了所有的步骤:
Public Sub PlainTextQuery() '省去了定义的部分
sConnect = \12.0;\ \2007.accdb\ sSQL = \SELECT...\
Set rsData = New ADODB.Recordset
rsData.Open sSQL, sConnect, adOpenForwardOnly, adLockReadOnly, adCmdText
If Not rsData.EOF Then
Sheet1.Range(\ rsData.Close
With Sheet1.Range(\
.Value = Array(\ .Font.Bold = True End With '调整列宽
Sheet1.UsedRange.EntireColumn.AutoFit Else
rsData.Close
MsgBox \Error: No records returned.\ End If '销毁对象
Set rsData = Nothing End Sub
像上面所说那样,解决一个问题,可以使用不同的对象。这里仅使用Recordset就解决了所有的问题,但是当需要使用Connection或者Command对象的时候,毫不犹豫的使用它们。