|
Open 方法 (ADO Recordset)
打开游标。
语法
recordset.Open Source, ActiveConnection, CursorType, LockType, Options 参数
Source 可选,变体型,通常为 SQL 语句、表名。
ActiveConnection 可选。变体型,一般为有效 Connection 对象变量名。
CursorType 可选,CursorTypeEnum 值,打开 Recordset 时使用游标类型。
LockType 可选。打开 Recordset 时使用的锁定(并发)类型。
Options 可选,长整型值,用于指示提供者如何计算 Source 参数。
应该说这五个参数都比较有用,但我们最常用的就是前面三个参数,后面两个
参数不用管它们就可以了。我只贴一部分帮助内容,大家实际看帮助时,不要
被这么多帮助内容吓到,通过实际使用就容易理解它们了。学习 ADO 和其它的
知识一样,也是需要理论和实践交互的过程,实际应用后再回头去看帮助中的
一些理论内容,可以理解的更深,提高也会更快。
这里我们遇到了一个词:游标(Cursor)。游标是数据库的组件,在数据库中,
对数据的操作我们直观的感觉是对“表”或者记录(集)进行的,但在系统内
部记录的留览和更新都是通过游标来进行的。 通俗点讲, 游标就是 “数据指针” 。
下面说明一下第三个参数 CursorType,游标可以并且一般也需要在打开前确定
其类型。打开游标是可以指定的类型有四种:
AdOpenForwardOnly (默认值)打开仅向前类型游标。
AdOpenKeyset 打开键集类型游标。
AdOpenDynamic 打开动态类型游标。
AdOpenStatic 打开静态类型游标。
如果需要计算返回记录集的记录数(RecordCount),需要将游标指定为
adOpenStatic 或 adOpenKeyset类型,如果需要对游标进行更新,则需要指定为
adOpenKeyset 或 AdOpenDynamic类型。
请将下行代码写到你 Sub Ado0中:
rst.Open Sql, cnn, adOpenKeyset
步骤 4:处理查询结果
处理查询结果通常是将查询结果写入工作表中或控件(比如 Listview)中。
处理 1:CopyFromRecordset 方法简便处理
如果只需要将查询的结果写入工作表中,可以使用 Range 对象的
CopyFromRecordset方法简便处理:
Sheet7.Range("A2").CopyFromRecordset rst
上面 A2 是要写入工作表区域的左上角单元格。
CopyFromRecordset 方法(Range 对象)
将一个 ADO或 DAO Recordset 对象的内容复制到工作表中,复制的起始位置在
指定区域的左上角。
句法
Rng.CopyFromRecordset(Data, MaxRows, MaxColumns)
参数
Data:Void 类型,必选。复制到指定区域的 Recordset 对象。
MaxRows:Variant 类型,可选。复制到工作表的记录个数上限。如果省略该参
数,将复制 Recordset 对象的所有记录。
MaxColumns:Variant 类型,可选。复制到工作表的字段个数上限。如果省略
该参数,将复制 Recordset 对象的所有字段。
处理 2:更为细致的处理 当查询结果不是写入工作表中,或者虽是写入工作表中但不是按查询结果的方
式时。这时需要对更为细致的处理,比如逐条记录、逐个字段进行处理。
For i = 1 To rst.RecordCount
For j = 0 To rst.Fields.Count - 1
Sheet7.Cells(i + 1, j + 1) = rst.Fields(j)
Next j
rst.MoveNext
Next i
大家仔细看一下上面的代码,应该不难理解的。简单地解释一下:
rst.RecordCount 是记录结果集中的记录数,前面我们已经提过。
rst.Fields.Count 是记录结果集中的字段数,Fields是字段集对象,由单个的
Field 字段组成,表示 Recordset 对象的列的集合。Fields 成员的下标从 0 开
始,0 表示第一个字段。
上面代码我们都假定第一行为预先设定好的表头,代码中不再考虑。有时需要
将字段名写入表头,请看下面的代码:
For i = 1 To rst.Fields.Count
Sheet7.Cells(1, i) = rst.Fields(i - 1).Name
Next i
请将上面代码写入 Sub Ado0 中。
处理 3:记录定位
(1)Move系列方法
上面已经用到了 Recordset 对象的 MoveNext 方法。
rst.MoveNext 移动游标到下一记录。在使用 MoveNext 移动游标时,一般需要
通过 Recordset 对象的 EOF 属性先进行判断游标是否到了记录尾。当游标到了
记录尾时,EOF 属性会被设置为 True。上面的代码可以这样写:
i = 1
Do While Not rst.EOF
For j = 0 To rst.Fields.Count - 1
Sheet7.Cells(i + 1, j + 1) = rst.Fields(j)
Next j
i = i + 1
Loop
请将上面代码写入 Sub Ado0 中。
与 EOF 对应的是 BOF,用来判断游标是否到了记录首。
与 MoveNext 类似的还有 MoveFirst、MoveLast 和 MovePrevious 方法,在指定
Recordset 对象中移动到第一个、最后一个或前一个记录并使该记录成为当前
记录。
此外,移动记录还可以使用 Move方法。
Move 方法(Recordset 对象)
移动 Recordset 对象中当前记录的位置。
语法
recordset.Move NumRecords, Start
参数
NumRecords 长整型,指定当前记录位置移动的记录数。 Start 可选,字符串或变体型,指定从哪儿开始移动。也可为下值之一:
AdBookmarkCurrent(0) 默认。从当前记录开始。
AdBookmarkFirst(1) 从首记录开始。
AdBookmarkLast(2) 从尾记录开始。
在 Recordset 对象中定位游标位置, 除了上面的几个 Move 方法外, 常用的还有:
(2)使用Recordset 对象的 AbsolutePosition 属性。
AbsolutePosition 属性可以设置或返回游标当前的记录位置。下面代码将游标
当前位置保存在变量 c中,然后设置为第 10条记录:
c = rst.AbsolutePosition
rst.AbsolutePosition = 10
(3)使用Recordset 对象的 Bookmark 属性。
Bookmark 属性可以设置或返回游标当前当前记录的书签。Recordset 对象的每
一条记录都有唯一的“书签”值。下面代码先将游标当前位置设置为第 10 条记
录,然后将当前记录的书签保存到变量 c 中,然后移动到下一条记录(实际使
用时一般是进行其它的处理操作),最后在通过设置 Bookmark 属性将记录定位
到原来的第 10 条记录。
rst.AbsolutePosition = 10
c = rst.Bookmark
rst.MoveNext
rst.Bookmark = c
与使用 AbsolutePosition 属性的区别是,使用 Bookmark 属性时,往往不知道
或不关心记录所处的实际位置。
(4)Find方法
Find 方法(Recordset 对象)
搜索 Recordset 中满足指定标准的记录。如果满足标准,则记录集位置设置在
找到的记录上,否则位置将设置在记录集的末尾。
语法
Find (criteria, SkipRows, searchDirection, start)
参数
criteria 字符串,包含指定用于搜索的列名、比较操作符和值的语句。
SkipRows 可选,长整型值,默认值为零,指定当前行或 start 书签的位移以
开始搜索。
searchDirection 可选的 SearchDirectionEnum 值,指定搜索应从当前行还
是下一个有效行开始。其值可为 adSearchForward(1) 或 adSearchBackward
(-1)。搜索是在记录集的开始还是末尾结束由 searchDirection 值决定。
start 可选,变体型书签,用作搜索的开始位置。
下面代码搜索所有记录,将姓陈的同学名单写入 Sheet7的第 3 列:
i = 2
rst.MoveFirst
rst.Find "姓名 Like '陈*'"
Do While Not rst.EOF
Sheet7.Cells(i, 3) = rst.Fields("姓名")
rst.Find "姓名 Like '陈*'", 1, adSearchForward
i = i + 1 Loop
请将上面代码写入 Sub Ado0 中。
步骤 5:关闭并释放 ADO 对象
使用 ADO 完成了全部工作后,应该关闭并释放创建的 ADO对象。
请将下面代码写到你 Sub Ado0中:
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
至此,我们完成了一个实例,也介绍完了 ADO代码的全部步骤。大家休息 10 分
钟。
上面的代码并没有完全写进我们的 Sub Ado0 中,大家可以自己试验一下运行结
果。
|
|