8.3 记录集对象
本节内容,
l 记录集对象的方法, 属性及集合
l 记录集对象的基本用法
l 记录集对象的分页显示功能
ADO中的内建对象 RecordSet是数据
库访问的主要接口,它指向数据表中的一
个记录集,有点类似于 C语言中指针的概
念。在任何时刻一个 Recordset对象只能
指向一条记录。
对象 Recordset存放的是来自表或查
询结果的记录集,是按记录(行)和字段
(列)的形式构成。可以在非显式打开
Connection对象的情况下,打开一个
Recordset对象;也可以创建一个
Connection对象,然后在该 Connection对
象上打开多个 Recordset对象。
Recordset对象创建一个数据游标的
同时,就从数据提供者那里得到一个数据
集。通过对创建与管理数据游标的
Recordset对象属性的访问与方法的调用,
可以在记录一级上对数据库中的数据进行
诸如增删记录、更新记录及在记录之间移
动等一系列操作。
?8.3.1 创建 Recordset对象
在使用 Recordset对象之前, 必须先
创建该 Recordset对象 。 创建 Recordset对
象可用以下几种方式,
( 1) 先创建 Connection对象, 然后在该
Connection对象上创建 Recordset对象 。
程序见书中 sample8-06.asp
该程序首先通过以下语句,
Set rs=Server.CreateObject("ADODB.RecordSet")
创建 Recordset对象后, 便可利用其
Open方法与数据库中表 member连接, 从而
实现从数据库中读取数据 。
( 2) 直接使用 Recordset对象的功能来创
建 Recordset对象
?8.3.2 记录集对象的行为属性
1 Recordset对象的行为属性
( 1) CursorType( 游标类型 ) 属性:
CursorType属性是 Recorset对象中的一个
重要属性 。 该属性决定 Recordset对象所
使用的游标类型 。 游标决定了可以对一个
记录集进行什么操作, 还决定了其他用户
可以对一个记录集进行什么样的改变 。 可
以用四种类型的游标打开一个记录集 。 下
面列出了游标的不同类型和限制,
adOpenDynamic( 动态游标):常量值 2。
使用动态游标,可以在记录集中向前或向
后移动。其他用户造成的记录的任何变化
都将在记录集中有所反映。此类型的游标
功能强大同时也是耗费系统资源最多的游
标。 Dynamic游标可以看到它们保存记录
集合的所有变化。使用 Dynamic游标的用
户可以看到其他用户所做的编辑、增加、
删除。如果数据提供者允许这种类型的游
标,那么它是通过每隔一段时间从数据源
重取数据来支持这种可视性的。毫无疑问
这会需要很多的资源。
adOpenKeyset( 键集游标 ),常量值 1。
其行为类似动态游标, 可以在记录集中向
前或向后移动 。 不同的只是禁止查看其他
用户添加的记录, 并禁止访问其他用户删
除的记录, 但其他用户所做的数据更改依
然可见 。
adOpenStatic( 静态游标):常量值 3。
使用静态游标,可以在记录集中向前或向
后移动。但是,如果用户在查看数据集同
时,数据集发生了更新,删除或添加的操作,
它将无法实时反映数据集的变化,
AdOpenFowardOnly( 前向游标 ),常量
值 0。 该类型游标占用最少的资源,因而能
得到最高的性能 。 它也是 recordset缺省
的游标类型,其行为类似静态游标, 唯一
的缺点是只能单向移动游标,只能使用
movenext这样的方法从头到尾单向遍历记
录集,而不能使用 moveprev,否则将提示
出错 。 直接使用 Command 或 Connection对
象的 Execute方法创建的游标就属于该类
游标 。
( 2) LockType( 锁 定 类 型 ) 属性:
LockType属性是 Recordset对象中的又一
个重要属性 。 当打开记录集时, 可以指定
锁定类型 LockType。 锁定就是如何确保数
据的完整性, 确保更改不会被覆盖 。 需
要避免的典型情况是多次更新, 比如一
个用户改动了一些数据, 接着另一 个用
户立即又将其做了修改 。 为了避免这种情
况发生, 就要锁定记录 。 有许多不同的方
法可以保证记录得到保护, 可通过锁定类
型来设置这些方法 。 有下面的四种锁定类
型,
AdLockReadOnly,常量值 1。 Recordset
对象以只读方式启动,指定不能修改记录
集中的记录,无法运行 AddNew,Update及
Delete等方法,适用于仅浏览数据的场合。
AdLockOptimstic,常量值 3。直到用
Update方法提交更新记录时才锁定记录。
AdLockPessimistic,常量值 2。当修改
记录时,数据提供者将尝试锁定记录以确
保成功地编辑记录。只要编辑一开始,则
立即锁住记录。
AdLockBatchOptimstic,常量值 4。同
时更新多笔数据时,暂不将更新数据存入
数据库,而是暂存在缓冲区中,等待
UpdateBatch调用后才将数据一次性写入
数据库。指定记录只能成批地更新。
当不需要改动任何记录时,应该使
用只读的记录集,这样提供者不用做任何
检测。对于一般的使用 AdLockOptimstic
( 3) Filter属性:该属性是 Recordset对
象的一个重要属性。虽然能使用 SQL语句
方便地对数据库中的记录进行过滤,但要
频繁的使用 SQL语句更新数据集将增大系
统的负担,降低系统性能。使用 Filter属
性将可以方便地对 Recordset对象的数据
集设置过滤条件。
Filter属性的语法格式如下,
Recordset.Filter=Criteria.String
其中 Criteria.String就是过滤条件字符
串, 它可由一个或多个用 AND或 OR等逻辑
运算符连接的子句组成 。
每个过滤条件由
<FieldName><Operator><Value>组成,如
"name='Jane'"。 若有两个或两个以上的
过滤条件,则使用 AND或 OR逻辑运算符将
各个过滤条件连接起来。
每个过滤条件使用时应遵循以下规则,
FieldName必须为当前 Recordset中的有
效字段名。如果字段名包含空格,必须用
方括号将字段名括起来。
Operator是关系运算符。可以是 <, >,
<=, >=, <>, =或 LIKE等运算符。
Value用于与对应字段匹配的值,如
'Jane'等(字符串和日期使用单引号)。
如果 Operator为 LIKE,Value可以使用匹
配符,可以使用星号( *)和百分号( %),
星号( *)匹配任意个字符,而百分号( %)
匹配任意一个字符。
在 LIKE 子句使用通配符时, 一般通
配符只在开头或结尾处使用 。
使用过滤条件后,ADO将记录集按该
过滤条件过滤出相应的记录。若没有符合
过滤条件的记录,则 Recordset对象的
RecordCount属性将返回 0,也可通过 EOF
和 BOF的值来判断。
过滤条件使用完毕, 需解除该过滤条
件时, 只要将空字符串赋值该 Filter属性
即可, 如,
<% Recordset,Filter ="" %>
( 4) CacheSize属性:当一个 Recordset对
象打开时, 从数据源中返回所需的记录数
据, 并将其保存在缓冲区中 。 用该属性指
定一个 Recordset对象一次可存于缓冲区
中记录的数目, 即从数据库服务器上一次
可以取得多少个记录, 默认值为 1。 改变
该属性值为一个适当的值可以提高数据库
服务器的效率 。 下面的脚本将 CacheSize
设定为 6,
<% Recordset,CacheSize=6 %>
( 5) MaxRecords属性:该属性指示通过查
询返回给 Recordset记录的最大数目 。 默
认值为 0,即返回所有所需的记录 。
在打开 Recordset前,该属性是可读写的,
用 MaxRecords属性可限制数据提供者从数
据源返回的记录数。而 Recordset打开后,
该属性是只读的。
2 与游标移动有关的属性
( 1) BOF属性:该属性指明当前记录指针
是否在首记录之前 。 若当前记录指针已经
移动到第一条记录之前, 则 BOF返回 True。
如果当前记录集没有记录, 则 BOF也返回
Ture。 一般在使用 MovePrevious方法前,
可以通过检测 BOF的值, 来判断是否已经
将当前记录指针移到首条记录之前 。
( 2) EOF属性:该属性指明当前记录指针
是否在尾记录之后 。 若当前记录指针已经
在最后一个记录之后, 则 EOF返回 Ture。
如果当前记录集中不存在记录, 则 EOF也
返回 Ture; 指针在其他位置时返回 False。
该属性一般用于对记录集进行从头到尾的
遍历时使用, 一般在使用 MoveNext或者
Move方法前, 可以通过检测该属性, 来判
断是否已经到了记录集末尾 。
( 3 ) BookMark 属 性, 该 属 性 只 有 在
Recordset对象支持 BookMark时才有效 。
当在记录集中移动时, 可能需要保留记录
的位置, 以后再移回来 。 同真实的书签相
似, 一个记录集书签是一个指向单个记录
的唯一的指针 。
( 4) RecordCount属性:该属性返回 Recordset对
象 中 记 录 的 个 数, 为 一 长 整 型 值 。 使用
RecordCount属性可确定 Recordset对象中记录
的数目 。 ADO无法确定记录数时该属性返回 -1。
该属性仅在打开与数据源的连接后才能使用 。
读已关闭的 Recordset上的 RecordCount属性将
产生错误 。
当 CursorType属性设置为
adOpenForwardOnly游标类型时,RecordCount
属性是无效的。因为当数据库在处理查询时,
Recordset正在数据库中继续查找匹配的数据。
因此在数据库中所有记录查完之前,
RecordCount属性是无效的。
( 5) AbsolutePage属性:该属性可以设置
或返回当前记录的绝对页号。通过使用该
属性,就可以按 PageSize属性指定的页记
录数在数据集中移动当前记录指针的位置,
直接跳到某一页。通常,AbsolutePage为
从 1开始到当前数据集的最大页数。需要
注意的是,AbsolutePage属性的使用需要
数据提供者提供支持才能有效地使用。
( 6) PageCount属性:该属性用来返回
Recordset对象中包含的数据页数,为一
长整型值。, 页, 的大小等于 PageSize属
性所设置的值,即每页记录的个数。只有
最后一页的记录个数可能小于 PageSize,
而其它页的记录个数均等于 PageSize。 若
Recordset对象不支持该属性,则该属性
返回 -1,表明 PageCount无法确定。
( 7) PageSize属性:该属性定义
Recordset中一页所包含的记录数,为一
长整型值。默认值为 10。当记录集返回到
Recordset时,该记录集就被逻辑地划分
为每页记录个数为 PageSize的若干页,除
最后一页外每页包含 PageSize个记录。页
的大小确定后,允许使用 AbsolutePage属
性移动到特定页的第一个记录。在用户希
望对数据进行分页显示时,该属性将非常
有用,可以在快速地移动到某一页后,对
该页中的记录进行操作。
( 8) AbsolutePosition属性:该属性用于
设置 Recordset对象当前记录的顺序位置 。
通常, 这个顺序号从 1开始到当前数据集
的记录总数 。 需 要 注 意的 是, 设置
AbsolutePosition属性时, ADO将从数据
源中再次读取数据集, 记录顺序将发生改
变 。
3 与记录排列顺序有关的属性
( 1) CursorLocation属性:该属性决定
Recordset对象能否被排序及 CursorLocation
的类型 。 其语法格式如下,
Recordset,CursorLocation[=Value]
其中 Value的值可以取以下两常量值,
adUseServer,常量值为 2。使用服务器端提供
的游标,为系统默认值。若设置为该值,则
Recordset对象将 Sort属性进行排序。
AdUseClient,常量值为 3。使用客户端提供的
游标。若设置为该值,就能使用 Sort属性对
Recordset对象进行排序。
( 2) Sort属性:该属性指定数据集将按哪
些字段进行升序或降序排序 。 它可以设置
或返回一个用逗号分隔的字段名排序字符
串, 其中的每个名称是 Recordset中的
Field。 其语法格式如下,
Recordset.Sort[=SortOrder]
其中 SortOrder为指定的排序字段或若干
个排序关键字组成的字符串,可以使用关
键词 ASC指定升序排序或使用关键词 DESC
指定降序排序。
4 与系统维护有关的属性
( 1) ActiveConnection属性:该属性用来
设置或返回当前活动的连接对象所使用的
连接命令字符串。如果指定了该参数,则
ADO将根据指定的参数打开新连接。可以
在打开 Recordset之后更改
ActiveConnection属性的值,以便连接到
其它数据提供者;或者将该属性设置为
Nothing,以便将 Recordset与所有数据提
供者断开。
( 2) Source属性:该属性指示记录集对象
中数据的来源,可以使用下列项之一:
Command对象,SQL语句、表的名称或存储
过程。该属性可以设置字符串值或
Command对象引用,但是只返回字符串值。
Source属性只能在 Recordset对象打开以
前设置,打开后该属性为只读。如果设置
Source属性为 Command对象,Recordset对
象的 ActiveConnection属性将继承指定
Command对象的 ActiveConnection属性值。
但是,读取 Source属性将不返回 Command
对象,而是将 Command对象的 CommandText
属性返回到设置 Source属性的地方 。 如
果 Source属性是一个 SQL语句, 存储过程
或表的名称, 则可以通过调用 Open方法传
递相应的 Options参数来优化性能 。
( 3) State属性:该属性是只读的, 可应
用于所有的对象, 作用是返回其对象状态
是打开还是关闭的 。
( 4) Status属性:该属性指示有关批量更
新, 或其它大量操作时的 Recordset对象
的当前状态 。
?8.3.3 记录集对象的方法
记录集对象有许多使用频率很高的方
法, 为方便编程将其分为以下几个部分 。
1 打开与关闭记录集对象的方法
( 1) 打开记录集的 Open方法,Open方法用
来 打 开 一 个 基 于 ActiveConnection 和
Source属性的 Recordset,还可以用来传递
打开游标所需的所有信息 。
语法格式,
Recordset.Open[Source],[ActiveConnecti
on],[CursorType],[LockType],[Options]
Open方法后的参数均是可选项 。 可
以在设置了记录集对象的相应属性后, 直
接调用记录集对象的 Open方法打开记录集 。
记录集对象的属性及其 Open方法中
的相应参数,其关系如下,
在记录集对象打开之前属性是可读
写的。
除非在执行 Open方法时传送相应的
参数,否则将使用缺省值来设置属性。如
果传送参数,则它将覆盖相应的属性设置,
并且用参数值更新属性设置。
在打开记录集对象后,这些属性将
变为只读。
如果在 Source参数中传送命令对象
并且同时传递 ActiveConnection参数,那
么将产生错误。命令对象的
ActiveConnection属性必须设置为有效的
连接对象或有效的连接字符串。
如果在 Source参数中传送的不是命
令对象,那么可以使用 Options参数优化
Source参数的计算。如果没有定义
Options则性能将会下降,原因是 ADO不能
确定参数是 SQL语句、存储过程还是表名。
可以通过设置 Options参数确定所用的
Source类型,以指示 ADO直接转到相关的
代码。如果 Options参数与 Source类型不
匹配,将产生错误。
( 2) 关闭记录集的 Close方法
在结束了记录集对象的操作后, 可使
用 Close方法释放所有关联的系统资源 。
使用 Close方法关闭记录集对象后, 系统
并没有将其占用的内存释放 。 要将对象从
内存中完全删除, 可将该对象变量设置为
Nothing。
在使用 Open方法再次打开记录集对
象前,一定要先使用 Close方法将其关闭,
否则 ADO将给出错误信息。
2 有关记录移动的方法
( 1) Move NumRecords方法:在记录集中
向前或向后移动指定数目的记录数。当
NumRecords参数值大于零时,则当前记录
指针位置将向前(即向记录集的末尾方向)
移动。相反,若 NumRecords值小于零,则
当前记录指针位置向后(即向记录集的开
始方向)移动。但需注意在空的记录集上
调用该方法将产生错误。
( 2) MoveFirst方法:该方法将 Recordset
对象中的当前记录指针移动到记录集的第
一条记录上 。
( 3) MoveNext方法:该方法将 Recordset
对象中的当前记录指针向后移动一个记录。
如果在最后一个记录位置调用 MoveNext方
法,则 ADO将当前记录设置到 Recordset的
尾记录之后,这时 EOF属性值返回 True。
如果 EOF属性为 True时,再调用该方法,
则 ADO将产生错误。
( 4) MovePrevious方法:该方法将
Recordset对象中的当前记录指针向前移
动一个记录。如果在第一个记录位置调用
MovePrevious方法,则 ADO将当前记录设
置到 Recordset的首记录之前,这时 BOF属
性将返回 True。 如果在 BOF属性为 True时,
再调用该方法,则 ADO将产生错误。如果
Recordset对象不支持书签或游标向前移
动,则 MovePrevious方法将产生错误。
( 5) MoveLast方法:该方法将 Recordset
对象中的当前记录指针移动到记录集的最
后一条记录上 。 如果 Recordset对象不支
持书签, 则 MoveLast方法将产生错误 。 例
如, 假设想在一个记录集中反向移动, 就
可以使用 MoveLast和 MovePrevious方法,
以及 BOF属性 。 下例演示了该如何实现 。
程序见书中 sample8-08.asp
图 8-1 5 sample8-08.asp运行结果
3 编辑修改数据的方法
( 1) Supports方法:为方便判别
Recordset对象的当前状态,可使用
Supports方法确定 Recordset对象是否支
持特定的功能。返回的布尔型值指示数据
提供者是否支持 CursorOptions参数所标
识的功能。该方法的语法格式如下,
Boolean=Recordset.Supports(CursorOptions)
其中 CursorOptions参数是一个类型
为长整型的表达式。如果 Recordset对象
支持其相应常量在 CursorOptions中的功
能,那么 Supports方法返回 True,否则返
回 False。
2) AddNew方法:该方法用于在数据库中添
加一条新记录 。 语句格式如下,
Recordset.AddNew [Fieldlist,Values]
其中,
Fieldlist,添加记录中的单个, 一组字
段名或序列位置 。
Values,添加记录中的单个或一组字段
的值。如果 Fieldlist是数组,那么
Values也必须是有相同成员数的数组,否
则将发生错误。同时字段名的次序和数据
类型必须与数组中相应字段值的次序相匹
配。
调用 AddNew方法后, 新记录将成为当
前记录, 并在调用 Update方法后将所作的
修改保存到新记录中 。
例如, 用 AddNew方法向表 member中添加第
33号会员记录 。
程序见书中 sample8-09.asp
( 3) Update方法:该方法用于保存对
Recordset对象的当前记录所做的所有修
改 。 使用 Update方法保存自从调用
AddNew方法, 或自从现有记录的任何字段
值发生更改之后, 对 Recordset对象的当
前记录所做的所有更改 。 条件是
Recordset对象必须支持更新 。
Update方法的语法格式如下,
Recordset.Update [FieldList,Values]
其中,
FieldList,变体型时,代表单个字段名;
变体型数组时,代表需要修改的若干字段
名或序号位置。 FieldList中的字段名必
须用, "” 括起来。
Values,变体型时, 代表单个值;变体
型数组时, 代表要修改的若干字段值 。 更
新值的数据类型要与 FieldList中对应的
字段所规定的类型一致 。
( 4) CancelUpdate方法:该方法用于取消
在调用 Update方法前对当前记录或新记录
所做的任何更改。在调用 Update方法后将
无法撤消对当前记录或新记录所做的更改,
除非所做的更改是可以用 RollbackTrans
方法回卷的事务的一部分,或者是可以用
CancelBatch方法取消批量更新的一部分。
( 5) UpdateBatch方法:如果工作在批量
更新模式下, 当修改了 Recordset对象中
的一些数据后, 可以使用 UpdateBatch方
法将 Recordset对象中的所有更改提交到
连接的数据库中 。 通 常 必 须 配 合
adLockBatchOptimistic的 LockType属性
一起使用 。
UpdateBatch方法的语法格式如下,
Recordset.UpdateBatch AffectRecords
其中 AffectRecords是一个可选参数,表
示进行批次模式数据更新的条件,分述如
下,
adAffectCurrent,常量值为 1。表示只针对当前
指针位置的数据进行更新动作。
adAffectGroup,常量值为 2。表示只针对符合
Filter属性的数据进行更新动作。
adAffectAll,常量值为 3。默认值,将当前
Recordset对象内已修改的所有数据进行更新动
作。
( 6) CancelBatch方法:该方法将取消批次模式
( batch) 的数据更新动作。通常必须配合
adLockBatchOptimistic的 LockType属性一起使
用。
CancelBatch方法的语法格式如下,
Recordset,CancelBatch AffectRecords
其中 AffectRecords是一个可选参数,参见上面的
UpdateBatch方法说明。
( 7) Delete方法:该方法用于删除当前记
录或一组记录。使用 Delete方法可标记
Recordset对象中的当前记录或一组记录
以便删除。如果 Recordset对象不允许删
除将出现错误。在立即更新模式下执行该
方法将进行立即删除操作,否则将在缓存
中对删除的记录做一删除标记,实际的删
除将在调用 UpdateBatch方法时进行。
4 Recordset记录集的方法
( 1) NextRecordset:该方法清除 Recordset
对象并返回下一个记录集 。
( 2) Requery方法:该方法通过重新执行
对象所基于的查询,来更新 Recordset对
象中的记录数据。通过重新执行原始命令
来查看自上次查询以来所增加、修改或删
除的记录,即刷新数据集中的全部内容。
调用该方法相当于先后调用了 Close和
Open方法。
( 3) Resync方法:该方法从连接的数据库
中刷新当前 Recordset对象中的记录数据 。
使用该方法可使当前 Recordset中的记录
数据与当前连接的数据库保持同步 。 与
Requery方法不同, Resync方法不重新执
行 Recordset对象的现行命令, 连接数据
库中的其他用户添加的新记录将不可见 。
5 Recordset对象的查询方法
通过 Recordset对象的 Find方法,可
在记录集中检索到符合条件的第一个记录,
这个被找到的记录将成为当前记录。
在一般的数据库应用程序中, 这种
查询是必不可少的, 同样在网络数据库中
也是一种重要的数据查询方法 。
Find方法语法格式如下,
Recordset.Find
Criteria[,SkipRows,SearchDirection,S
tart]
其中,
Criteria,为一个字符串类型的查询条
件。可以由字段、比较运算符和预定的查
询值组成,具体组成参见 Filter属性中的
Criteria String。
SkipRows,为一长整型值 。 该选项可以
省略, 缺省时, 表示从当前记录开始查询;
如设置该参数, 则表示查询时从当前记录
开始跳过 SkipRows个记录后再查询, 这些
被跳过的记录将不予理会 。
SearchDirection为查询方向, 可为以下
常量之一,
AdSearchForward,常量值为 1。默认值,
往后(即最后一个记录)方向查询。
AdSearchBackward,常量值为 -1。往前
(即第一个记录)方向查询。
?8.3.4 记录集对象数据集合
记录集对象提供的数据集合包括
Fields数据集合与 Properties数据集合等。
Fields数据集合中包含 Recordset对象的
所有 Field数据字段对象; Properties数
据集合中则是包含 Recordset对象的所有
属性。
1 Fields数据集合
Fields数据集合所提供的方法与属性有
Count属性, Refresh方法与 Item方法等,
分述如下,
Count属性:该属性可用来取得 Fields数
据集合中所包含的 Field对象个数。
Refresh方法:该方法可以重新取得
Fields数据集合中所包含的所有 Field对
象。
Item方法:该方法可以用来取得 Fields
数据集合中所包含的所有 Field对象。该
方法有一个参数,表示所要取得的 Field
对象索引值,这个索引值通常介于 0到
Count属性值 -1之间。
2 Field对象
Field对象是负责记录记录集对象的
每一项字段相关属性,Field对象所提供
的属性、方法及数据集合包括 Name属性、
Value属性,Type属性,Attribute属性、
NumericScale属性,Precision属性、
ActualSize属性,DefineSize属性、
OriginalValue属性,UnderlyingValue属
性,AppendChunk方法,GetChunk方法及
Properties数据集合等,分述如下,
Name属性:该属性表示对象属性的名称。
Value属性:该属性表示对象属性的属性
值。
Type属性:该属性表示对象属性的数据
类型,与 Property对象的 Type属性相同。
Attributes 属性和 Properties 集合:
可决定对于给定字段哪些类型的功能受到
支持。
NumericScale,该属性表示数据字段所
被允许存储的数字个数。
Precision属性:该属性表示数据字段所
被允许的最大数字,通常表示此数据字段
的有效数字。
ActualSize 属性:该属性可返回给定字
段中数据的实际大小。
DefinedSize 属性:该属性可返回已声
明的字段大小。
OriginalValue属性:该属性表示数据字
段的内容是从第一次启动或是在调用
Update方法前的值。
UnderlyingValue属性:该属性表示数据
库中所取出来的数据与 OriginalValue属
性有所不同。
AppendChunk方法和 GetChunk方法:可处
理包含长二进制或长字符数据的字段值。
?8.3.5 记录集对象的使用
综合使用记录集对象的属性和方法
可以编写出功能强大的数据库应用程序。
利用记录集对象中的一些属性,可以精确
地控制记录指针的行为,提高检索和更新
数据的能力。尽管连接对象和命令对象简
化了连接数据库和查询任务,但它们与记
录集对象相比仍有许多不足。所有一般的
ASP应用程序均使用记录集对象来管理检
索和修改数据。由于记录集对象的 AddNew、
Delete,Update方法操作数据集的效率较
低,推荐使用 SQL语句来完成相应操作。
1 用记录集显示记录
记录集可以用来代表表中的记录 。 与
表一样, 一个记录集包含一条或多条记录
( 行 ), 每个记录包括一个或多个域 ( 字
段 ) 。 在任何时刻, 只有一条记录是当前
记录 。
要创建记录集对象的一个实例, 可以
使用连接对象的 Execute()方法 。 当使用
Execute()方法从一个数据库返回查询结
果时, 一个记录集对象就会被自动创建 。
这里有一个例子,
<%
Set MyConn=Server.CreateObject("ADODB.Connection")
MyConn.Open "dsn=vod;uid=sa;pwd=password;"
Set RS=MyConn.Execute("SELECT * FROM member")
RS.Close
MyConn.Close
%>
在这个脚本中, 使用一个 SQL SELECT语
句从一个表 member中返回了所有的记录 。
Execute()方法返回一个记录集 。 该记录
集被分配给变量 RS,然后关闭了这个记录
集 。 最后, 关闭与数据库的连接 。
记录集中的每一条记录都对应于表
member中的一条记录 。 要显示记录集中的
所有记录, 只要简单地做一个循环就可以,
正如上一章的程序 sample9-03.asp所示 。
在程序 sample9-03.asp的脚本中,DO
WHILE… LOOP循环用来扫描记录集 RS中的
每一条记录,把每个记录的 hy_name字段
值输出到浏览器。这段脚本显示了表
member中的所有记录。
当在一个记录集对象中收集了数据
后, 当前记录总是第一条记录 。 程序
sample10-03.asp调用了记录集对象的
MoveNext方法, 使当前记录移到下一条记
录 。 当所有的记录都显示完时, 记录集对
象的 EOF属性的值将变为 true,从而退出
DO WHILE… LOOP循环 。
一个记录集对象有一个域集合,包
含一个或多个域对象。一个域对象代表表
中的一个特定的字段。例如,在 sample9-
03.asp的脚本中,使用了表达式
RS("hy_name")来显示字段 hy_name。 实际
上,可以通过许多中途径显示一个字段的
值。下面的每一个表达式都可以显示字段
hy_name的值,
RS("hy_name")
RS(0)
RS.Fields("hy_name")
RS.Fields(0)
RS.Fields.Item("hy_name")
RS.Fields.Item(0)
这里既可以通过字段名,也可以通过顺序号
来指定一个字段。即使用 RS("hy_name")或 RS(0)
来代表字段 hy_name,两种方法起到同样的效果,
因为字段 hy_name对应于表中的第一个字段(第
一个字段的顺序号是 0)。
当不知道一个记录集中的字段名时, 通过顺
序号指定一个域是有用处的 。 例如, 下面的
sample8-10.asp脚本显示了一个表中的所有记
录的所有字段 。
程序见书中 sample8-10.asp
在这个例子中, 域集合的 Count属性用来返回
该记录集中的域的数目 。 Name属性用来返回每
个域的名字 。 两个 FOR… NEXT循环用来对记录集
中的所有字段进行操作 。 不论表中有多少记录
和字段, 它们将被全部显示 。 程序执行结果如
图 8-16所示 。
图 8-16 sample8-10.asp运行结果
2 对记录集进行分页
当检索到大量记录数据后, 在有限
的空间内不能显示检索到的全部记录数据,
必须将检索到的全部记录分页显示才能满
足实际需要 。 目前每个网站均有关键字查
询功能, 所以该功能是建立网站所必须的 。
比如要显示 VOD点播系统节目单,从
方便用户的角度考虑,就不应该把所有的
节目都显示在同一个 ASP页中,这时将允
许点播节目的会员进行翻页显示。
将数据库的查询结果分页显示的方法有很
多, 但主要有两种,
( 1) 将数据库中所有符合查询条件的记录
一次性的都读入到 recordset,存放在内
存中, 然后通过 ADO Recordset 对象所提
供的几个专门支持分页处理的属性, 如
PageSize( 页大小 ), PageCount( 页数
目 ) 以及 AbsolutePage( 绝对页 ) 来管理
分页处理 。
( 2)根据客户的指示,每次分别从符合
查询条件的记录中将规定数目的记录数读
取出来并显示。
两者的主要差别在于前者是一次
性将所有记录都读入内存, 然后再根据指
示来依次做判断分析, 从而达到分页显示
的效果;而后者是先根据指示做出判断,
并将规定数目的符合查询条件的记录读入
内存, 从而直接达到分页显示的功能 。
可以很明显地感觉到,当数据库中
的记录数达到上万或更多时,第一种方法
的执行效率将明显低于第二种方法,因为
当每一个客户查询页面时都要将所有符合
条件的记录存放在服务器内存中,然后在
进行分页等处理,如果同时有超过 100个
的客户在线查询,
那么 ASP 应用程序的执行效率将大
受影响 。 但是, 当服务器上数据库的记录
数以及同时在线的人数并不是很多时, 两
者在执行效率上是相差无几的, 此时一般
就采用第一种方法, 因为第一种方法的
ASP程序编写相对第二种方法要简单明了
得多 。
要把一个记录集分成多个页,可以
用 PageSize属性指定一页中的记录个数。
然后用 AbsolutePage属性移动到一个特定
的页。最后,用 PageCount属性返回总页
数。程序 sample8-11.asp使用的是第一种
分页显示方法。程序见书中 sample8-
11.asp
这个 ASP网页一次显示表 member中的
五条记录一个 session变量 Currentpage被
用来跟踪记录集的当前页。当用户单击
NEXT时,就显示下一页记录,当用户单击
PREV时,就显示上一页。
程序执行结果如图 8-17所示
本节内容,
l 记录集对象的方法, 属性及集合
l 记录集对象的基本用法
l 记录集对象的分页显示功能
ADO中的内建对象 RecordSet是数据
库访问的主要接口,它指向数据表中的一
个记录集,有点类似于 C语言中指针的概
念。在任何时刻一个 Recordset对象只能
指向一条记录。
对象 Recordset存放的是来自表或查
询结果的记录集,是按记录(行)和字段
(列)的形式构成。可以在非显式打开
Connection对象的情况下,打开一个
Recordset对象;也可以创建一个
Connection对象,然后在该 Connection对
象上打开多个 Recordset对象。
Recordset对象创建一个数据游标的
同时,就从数据提供者那里得到一个数据
集。通过对创建与管理数据游标的
Recordset对象属性的访问与方法的调用,
可以在记录一级上对数据库中的数据进行
诸如增删记录、更新记录及在记录之间移
动等一系列操作。
?8.3.1 创建 Recordset对象
在使用 Recordset对象之前, 必须先
创建该 Recordset对象 。 创建 Recordset对
象可用以下几种方式,
( 1) 先创建 Connection对象, 然后在该
Connection对象上创建 Recordset对象 。
程序见书中 sample8-06.asp
该程序首先通过以下语句,
Set rs=Server.CreateObject("ADODB.RecordSet")
创建 Recordset对象后, 便可利用其
Open方法与数据库中表 member连接, 从而
实现从数据库中读取数据 。
( 2) 直接使用 Recordset对象的功能来创
建 Recordset对象
?8.3.2 记录集对象的行为属性
1 Recordset对象的行为属性
( 1) CursorType( 游标类型 ) 属性:
CursorType属性是 Recorset对象中的一个
重要属性 。 该属性决定 Recordset对象所
使用的游标类型 。 游标决定了可以对一个
记录集进行什么操作, 还决定了其他用户
可以对一个记录集进行什么样的改变 。 可
以用四种类型的游标打开一个记录集 。 下
面列出了游标的不同类型和限制,
adOpenDynamic( 动态游标):常量值 2。
使用动态游标,可以在记录集中向前或向
后移动。其他用户造成的记录的任何变化
都将在记录集中有所反映。此类型的游标
功能强大同时也是耗费系统资源最多的游
标。 Dynamic游标可以看到它们保存记录
集合的所有变化。使用 Dynamic游标的用
户可以看到其他用户所做的编辑、增加、
删除。如果数据提供者允许这种类型的游
标,那么它是通过每隔一段时间从数据源
重取数据来支持这种可视性的。毫无疑问
这会需要很多的资源。
adOpenKeyset( 键集游标 ),常量值 1。
其行为类似动态游标, 可以在记录集中向
前或向后移动 。 不同的只是禁止查看其他
用户添加的记录, 并禁止访问其他用户删
除的记录, 但其他用户所做的数据更改依
然可见 。
adOpenStatic( 静态游标):常量值 3。
使用静态游标,可以在记录集中向前或向
后移动。但是,如果用户在查看数据集同
时,数据集发生了更新,删除或添加的操作,
它将无法实时反映数据集的变化,
AdOpenFowardOnly( 前向游标 ),常量
值 0。 该类型游标占用最少的资源,因而能
得到最高的性能 。 它也是 recordset缺省
的游标类型,其行为类似静态游标, 唯一
的缺点是只能单向移动游标,只能使用
movenext这样的方法从头到尾单向遍历记
录集,而不能使用 moveprev,否则将提示
出错 。 直接使用 Command 或 Connection对
象的 Execute方法创建的游标就属于该类
游标 。
( 2) LockType( 锁 定 类 型 ) 属性:
LockType属性是 Recordset对象中的又一
个重要属性 。 当打开记录集时, 可以指定
锁定类型 LockType。 锁定就是如何确保数
据的完整性, 确保更改不会被覆盖 。 需
要避免的典型情况是多次更新, 比如一
个用户改动了一些数据, 接着另一 个用
户立即又将其做了修改 。 为了避免这种情
况发生, 就要锁定记录 。 有许多不同的方
法可以保证记录得到保护, 可通过锁定类
型来设置这些方法 。 有下面的四种锁定类
型,
AdLockReadOnly,常量值 1。 Recordset
对象以只读方式启动,指定不能修改记录
集中的记录,无法运行 AddNew,Update及
Delete等方法,适用于仅浏览数据的场合。
AdLockOptimstic,常量值 3。直到用
Update方法提交更新记录时才锁定记录。
AdLockPessimistic,常量值 2。当修改
记录时,数据提供者将尝试锁定记录以确
保成功地编辑记录。只要编辑一开始,则
立即锁住记录。
AdLockBatchOptimstic,常量值 4。同
时更新多笔数据时,暂不将更新数据存入
数据库,而是暂存在缓冲区中,等待
UpdateBatch调用后才将数据一次性写入
数据库。指定记录只能成批地更新。
当不需要改动任何记录时,应该使
用只读的记录集,这样提供者不用做任何
检测。对于一般的使用 AdLockOptimstic
( 3) Filter属性:该属性是 Recordset对
象的一个重要属性。虽然能使用 SQL语句
方便地对数据库中的记录进行过滤,但要
频繁的使用 SQL语句更新数据集将增大系
统的负担,降低系统性能。使用 Filter属
性将可以方便地对 Recordset对象的数据
集设置过滤条件。
Filter属性的语法格式如下,
Recordset.Filter=Criteria.String
其中 Criteria.String就是过滤条件字符
串, 它可由一个或多个用 AND或 OR等逻辑
运算符连接的子句组成 。
每个过滤条件由
<FieldName><Operator><Value>组成,如
"name='Jane'"。 若有两个或两个以上的
过滤条件,则使用 AND或 OR逻辑运算符将
各个过滤条件连接起来。
每个过滤条件使用时应遵循以下规则,
FieldName必须为当前 Recordset中的有
效字段名。如果字段名包含空格,必须用
方括号将字段名括起来。
Operator是关系运算符。可以是 <, >,
<=, >=, <>, =或 LIKE等运算符。
Value用于与对应字段匹配的值,如
'Jane'等(字符串和日期使用单引号)。
如果 Operator为 LIKE,Value可以使用匹
配符,可以使用星号( *)和百分号( %),
星号( *)匹配任意个字符,而百分号( %)
匹配任意一个字符。
在 LIKE 子句使用通配符时, 一般通
配符只在开头或结尾处使用 。
使用过滤条件后,ADO将记录集按该
过滤条件过滤出相应的记录。若没有符合
过滤条件的记录,则 Recordset对象的
RecordCount属性将返回 0,也可通过 EOF
和 BOF的值来判断。
过滤条件使用完毕, 需解除该过滤条
件时, 只要将空字符串赋值该 Filter属性
即可, 如,
<% Recordset,Filter ="" %>
( 4) CacheSize属性:当一个 Recordset对
象打开时, 从数据源中返回所需的记录数
据, 并将其保存在缓冲区中 。 用该属性指
定一个 Recordset对象一次可存于缓冲区
中记录的数目, 即从数据库服务器上一次
可以取得多少个记录, 默认值为 1。 改变
该属性值为一个适当的值可以提高数据库
服务器的效率 。 下面的脚本将 CacheSize
设定为 6,
<% Recordset,CacheSize=6 %>
( 5) MaxRecords属性:该属性指示通过查
询返回给 Recordset记录的最大数目 。 默
认值为 0,即返回所有所需的记录 。
在打开 Recordset前,该属性是可读写的,
用 MaxRecords属性可限制数据提供者从数
据源返回的记录数。而 Recordset打开后,
该属性是只读的。
2 与游标移动有关的属性
( 1) BOF属性:该属性指明当前记录指针
是否在首记录之前 。 若当前记录指针已经
移动到第一条记录之前, 则 BOF返回 True。
如果当前记录集没有记录, 则 BOF也返回
Ture。 一般在使用 MovePrevious方法前,
可以通过检测 BOF的值, 来判断是否已经
将当前记录指针移到首条记录之前 。
( 2) EOF属性:该属性指明当前记录指针
是否在尾记录之后 。 若当前记录指针已经
在最后一个记录之后, 则 EOF返回 Ture。
如果当前记录集中不存在记录, 则 EOF也
返回 Ture; 指针在其他位置时返回 False。
该属性一般用于对记录集进行从头到尾的
遍历时使用, 一般在使用 MoveNext或者
Move方法前, 可以通过检测该属性, 来判
断是否已经到了记录集末尾 。
( 3 ) BookMark 属 性, 该 属 性 只 有 在
Recordset对象支持 BookMark时才有效 。
当在记录集中移动时, 可能需要保留记录
的位置, 以后再移回来 。 同真实的书签相
似, 一个记录集书签是一个指向单个记录
的唯一的指针 。
( 4) RecordCount属性:该属性返回 Recordset对
象 中 记 录 的 个 数, 为 一 长 整 型 值 。 使用
RecordCount属性可确定 Recordset对象中记录
的数目 。 ADO无法确定记录数时该属性返回 -1。
该属性仅在打开与数据源的连接后才能使用 。
读已关闭的 Recordset上的 RecordCount属性将
产生错误 。
当 CursorType属性设置为
adOpenForwardOnly游标类型时,RecordCount
属性是无效的。因为当数据库在处理查询时,
Recordset正在数据库中继续查找匹配的数据。
因此在数据库中所有记录查完之前,
RecordCount属性是无效的。
( 5) AbsolutePage属性:该属性可以设置
或返回当前记录的绝对页号。通过使用该
属性,就可以按 PageSize属性指定的页记
录数在数据集中移动当前记录指针的位置,
直接跳到某一页。通常,AbsolutePage为
从 1开始到当前数据集的最大页数。需要
注意的是,AbsolutePage属性的使用需要
数据提供者提供支持才能有效地使用。
( 6) PageCount属性:该属性用来返回
Recordset对象中包含的数据页数,为一
长整型值。, 页, 的大小等于 PageSize属
性所设置的值,即每页记录的个数。只有
最后一页的记录个数可能小于 PageSize,
而其它页的记录个数均等于 PageSize。 若
Recordset对象不支持该属性,则该属性
返回 -1,表明 PageCount无法确定。
( 7) PageSize属性:该属性定义
Recordset中一页所包含的记录数,为一
长整型值。默认值为 10。当记录集返回到
Recordset时,该记录集就被逻辑地划分
为每页记录个数为 PageSize的若干页,除
最后一页外每页包含 PageSize个记录。页
的大小确定后,允许使用 AbsolutePage属
性移动到特定页的第一个记录。在用户希
望对数据进行分页显示时,该属性将非常
有用,可以在快速地移动到某一页后,对
该页中的记录进行操作。
( 8) AbsolutePosition属性:该属性用于
设置 Recordset对象当前记录的顺序位置 。
通常, 这个顺序号从 1开始到当前数据集
的记录总数 。 需 要 注 意的 是, 设置
AbsolutePosition属性时, ADO将从数据
源中再次读取数据集, 记录顺序将发生改
变 。
3 与记录排列顺序有关的属性
( 1) CursorLocation属性:该属性决定
Recordset对象能否被排序及 CursorLocation
的类型 。 其语法格式如下,
Recordset,CursorLocation[=Value]
其中 Value的值可以取以下两常量值,
adUseServer,常量值为 2。使用服务器端提供
的游标,为系统默认值。若设置为该值,则
Recordset对象将 Sort属性进行排序。
AdUseClient,常量值为 3。使用客户端提供的
游标。若设置为该值,就能使用 Sort属性对
Recordset对象进行排序。
( 2) Sort属性:该属性指定数据集将按哪
些字段进行升序或降序排序 。 它可以设置
或返回一个用逗号分隔的字段名排序字符
串, 其中的每个名称是 Recordset中的
Field。 其语法格式如下,
Recordset.Sort[=SortOrder]
其中 SortOrder为指定的排序字段或若干
个排序关键字组成的字符串,可以使用关
键词 ASC指定升序排序或使用关键词 DESC
指定降序排序。
4 与系统维护有关的属性
( 1) ActiveConnection属性:该属性用来
设置或返回当前活动的连接对象所使用的
连接命令字符串。如果指定了该参数,则
ADO将根据指定的参数打开新连接。可以
在打开 Recordset之后更改
ActiveConnection属性的值,以便连接到
其它数据提供者;或者将该属性设置为
Nothing,以便将 Recordset与所有数据提
供者断开。
( 2) Source属性:该属性指示记录集对象
中数据的来源,可以使用下列项之一:
Command对象,SQL语句、表的名称或存储
过程。该属性可以设置字符串值或
Command对象引用,但是只返回字符串值。
Source属性只能在 Recordset对象打开以
前设置,打开后该属性为只读。如果设置
Source属性为 Command对象,Recordset对
象的 ActiveConnection属性将继承指定
Command对象的 ActiveConnection属性值。
但是,读取 Source属性将不返回 Command
对象,而是将 Command对象的 CommandText
属性返回到设置 Source属性的地方 。 如
果 Source属性是一个 SQL语句, 存储过程
或表的名称, 则可以通过调用 Open方法传
递相应的 Options参数来优化性能 。
( 3) State属性:该属性是只读的, 可应
用于所有的对象, 作用是返回其对象状态
是打开还是关闭的 。
( 4) Status属性:该属性指示有关批量更
新, 或其它大量操作时的 Recordset对象
的当前状态 。
?8.3.3 记录集对象的方法
记录集对象有许多使用频率很高的方
法, 为方便编程将其分为以下几个部分 。
1 打开与关闭记录集对象的方法
( 1) 打开记录集的 Open方法,Open方法用
来 打 开 一 个 基 于 ActiveConnection 和
Source属性的 Recordset,还可以用来传递
打开游标所需的所有信息 。
语法格式,
Recordset.Open[Source],[ActiveConnecti
on],[CursorType],[LockType],[Options]
Open方法后的参数均是可选项 。 可
以在设置了记录集对象的相应属性后, 直
接调用记录集对象的 Open方法打开记录集 。
记录集对象的属性及其 Open方法中
的相应参数,其关系如下,
在记录集对象打开之前属性是可读
写的。
除非在执行 Open方法时传送相应的
参数,否则将使用缺省值来设置属性。如
果传送参数,则它将覆盖相应的属性设置,
并且用参数值更新属性设置。
在打开记录集对象后,这些属性将
变为只读。
如果在 Source参数中传送命令对象
并且同时传递 ActiveConnection参数,那
么将产生错误。命令对象的
ActiveConnection属性必须设置为有效的
连接对象或有效的连接字符串。
如果在 Source参数中传送的不是命
令对象,那么可以使用 Options参数优化
Source参数的计算。如果没有定义
Options则性能将会下降,原因是 ADO不能
确定参数是 SQL语句、存储过程还是表名。
可以通过设置 Options参数确定所用的
Source类型,以指示 ADO直接转到相关的
代码。如果 Options参数与 Source类型不
匹配,将产生错误。
( 2) 关闭记录集的 Close方法
在结束了记录集对象的操作后, 可使
用 Close方法释放所有关联的系统资源 。
使用 Close方法关闭记录集对象后, 系统
并没有将其占用的内存释放 。 要将对象从
内存中完全删除, 可将该对象变量设置为
Nothing。
在使用 Open方法再次打开记录集对
象前,一定要先使用 Close方法将其关闭,
否则 ADO将给出错误信息。
2 有关记录移动的方法
( 1) Move NumRecords方法:在记录集中
向前或向后移动指定数目的记录数。当
NumRecords参数值大于零时,则当前记录
指针位置将向前(即向记录集的末尾方向)
移动。相反,若 NumRecords值小于零,则
当前记录指针位置向后(即向记录集的开
始方向)移动。但需注意在空的记录集上
调用该方法将产生错误。
( 2) MoveFirst方法:该方法将 Recordset
对象中的当前记录指针移动到记录集的第
一条记录上 。
( 3) MoveNext方法:该方法将 Recordset
对象中的当前记录指针向后移动一个记录。
如果在最后一个记录位置调用 MoveNext方
法,则 ADO将当前记录设置到 Recordset的
尾记录之后,这时 EOF属性值返回 True。
如果 EOF属性为 True时,再调用该方法,
则 ADO将产生错误。
( 4) MovePrevious方法:该方法将
Recordset对象中的当前记录指针向前移
动一个记录。如果在第一个记录位置调用
MovePrevious方法,则 ADO将当前记录设
置到 Recordset的首记录之前,这时 BOF属
性将返回 True。 如果在 BOF属性为 True时,
再调用该方法,则 ADO将产生错误。如果
Recordset对象不支持书签或游标向前移
动,则 MovePrevious方法将产生错误。
( 5) MoveLast方法:该方法将 Recordset
对象中的当前记录指针移动到记录集的最
后一条记录上 。 如果 Recordset对象不支
持书签, 则 MoveLast方法将产生错误 。 例
如, 假设想在一个记录集中反向移动, 就
可以使用 MoveLast和 MovePrevious方法,
以及 BOF属性 。 下例演示了该如何实现 。
程序见书中 sample8-08.asp
图 8-1 5 sample8-08.asp运行结果
3 编辑修改数据的方法
( 1) Supports方法:为方便判别
Recordset对象的当前状态,可使用
Supports方法确定 Recordset对象是否支
持特定的功能。返回的布尔型值指示数据
提供者是否支持 CursorOptions参数所标
识的功能。该方法的语法格式如下,
Boolean=Recordset.Supports(CursorOptions)
其中 CursorOptions参数是一个类型
为长整型的表达式。如果 Recordset对象
支持其相应常量在 CursorOptions中的功
能,那么 Supports方法返回 True,否则返
回 False。
2) AddNew方法:该方法用于在数据库中添
加一条新记录 。 语句格式如下,
Recordset.AddNew [Fieldlist,Values]
其中,
Fieldlist,添加记录中的单个, 一组字
段名或序列位置 。
Values,添加记录中的单个或一组字段
的值。如果 Fieldlist是数组,那么
Values也必须是有相同成员数的数组,否
则将发生错误。同时字段名的次序和数据
类型必须与数组中相应字段值的次序相匹
配。
调用 AddNew方法后, 新记录将成为当
前记录, 并在调用 Update方法后将所作的
修改保存到新记录中 。
例如, 用 AddNew方法向表 member中添加第
33号会员记录 。
程序见书中 sample8-09.asp
( 3) Update方法:该方法用于保存对
Recordset对象的当前记录所做的所有修
改 。 使用 Update方法保存自从调用
AddNew方法, 或自从现有记录的任何字段
值发生更改之后, 对 Recordset对象的当
前记录所做的所有更改 。 条件是
Recordset对象必须支持更新 。
Update方法的语法格式如下,
Recordset.Update [FieldList,Values]
其中,
FieldList,变体型时,代表单个字段名;
变体型数组时,代表需要修改的若干字段
名或序号位置。 FieldList中的字段名必
须用, "” 括起来。
Values,变体型时, 代表单个值;变体
型数组时, 代表要修改的若干字段值 。 更
新值的数据类型要与 FieldList中对应的
字段所规定的类型一致 。
( 4) CancelUpdate方法:该方法用于取消
在调用 Update方法前对当前记录或新记录
所做的任何更改。在调用 Update方法后将
无法撤消对当前记录或新记录所做的更改,
除非所做的更改是可以用 RollbackTrans
方法回卷的事务的一部分,或者是可以用
CancelBatch方法取消批量更新的一部分。
( 5) UpdateBatch方法:如果工作在批量
更新模式下, 当修改了 Recordset对象中
的一些数据后, 可以使用 UpdateBatch方
法将 Recordset对象中的所有更改提交到
连接的数据库中 。 通 常 必 须 配 合
adLockBatchOptimistic的 LockType属性
一起使用 。
UpdateBatch方法的语法格式如下,
Recordset.UpdateBatch AffectRecords
其中 AffectRecords是一个可选参数,表
示进行批次模式数据更新的条件,分述如
下,
adAffectCurrent,常量值为 1。表示只针对当前
指针位置的数据进行更新动作。
adAffectGroup,常量值为 2。表示只针对符合
Filter属性的数据进行更新动作。
adAffectAll,常量值为 3。默认值,将当前
Recordset对象内已修改的所有数据进行更新动
作。
( 6) CancelBatch方法:该方法将取消批次模式
( batch) 的数据更新动作。通常必须配合
adLockBatchOptimistic的 LockType属性一起使
用。
CancelBatch方法的语法格式如下,
Recordset,CancelBatch AffectRecords
其中 AffectRecords是一个可选参数,参见上面的
UpdateBatch方法说明。
( 7) Delete方法:该方法用于删除当前记
录或一组记录。使用 Delete方法可标记
Recordset对象中的当前记录或一组记录
以便删除。如果 Recordset对象不允许删
除将出现错误。在立即更新模式下执行该
方法将进行立即删除操作,否则将在缓存
中对删除的记录做一删除标记,实际的删
除将在调用 UpdateBatch方法时进行。
4 Recordset记录集的方法
( 1) NextRecordset:该方法清除 Recordset
对象并返回下一个记录集 。
( 2) Requery方法:该方法通过重新执行
对象所基于的查询,来更新 Recordset对
象中的记录数据。通过重新执行原始命令
来查看自上次查询以来所增加、修改或删
除的记录,即刷新数据集中的全部内容。
调用该方法相当于先后调用了 Close和
Open方法。
( 3) Resync方法:该方法从连接的数据库
中刷新当前 Recordset对象中的记录数据 。
使用该方法可使当前 Recordset中的记录
数据与当前连接的数据库保持同步 。 与
Requery方法不同, Resync方法不重新执
行 Recordset对象的现行命令, 连接数据
库中的其他用户添加的新记录将不可见 。
5 Recordset对象的查询方法
通过 Recordset对象的 Find方法,可
在记录集中检索到符合条件的第一个记录,
这个被找到的记录将成为当前记录。
在一般的数据库应用程序中, 这种
查询是必不可少的, 同样在网络数据库中
也是一种重要的数据查询方法 。
Find方法语法格式如下,
Recordset.Find
Criteria[,SkipRows,SearchDirection,S
tart]
其中,
Criteria,为一个字符串类型的查询条
件。可以由字段、比较运算符和预定的查
询值组成,具体组成参见 Filter属性中的
Criteria String。
SkipRows,为一长整型值 。 该选项可以
省略, 缺省时, 表示从当前记录开始查询;
如设置该参数, 则表示查询时从当前记录
开始跳过 SkipRows个记录后再查询, 这些
被跳过的记录将不予理会 。
SearchDirection为查询方向, 可为以下
常量之一,
AdSearchForward,常量值为 1。默认值,
往后(即最后一个记录)方向查询。
AdSearchBackward,常量值为 -1。往前
(即第一个记录)方向查询。
?8.3.4 记录集对象数据集合
记录集对象提供的数据集合包括
Fields数据集合与 Properties数据集合等。
Fields数据集合中包含 Recordset对象的
所有 Field数据字段对象; Properties数
据集合中则是包含 Recordset对象的所有
属性。
1 Fields数据集合
Fields数据集合所提供的方法与属性有
Count属性, Refresh方法与 Item方法等,
分述如下,
Count属性:该属性可用来取得 Fields数
据集合中所包含的 Field对象个数。
Refresh方法:该方法可以重新取得
Fields数据集合中所包含的所有 Field对
象。
Item方法:该方法可以用来取得 Fields
数据集合中所包含的所有 Field对象。该
方法有一个参数,表示所要取得的 Field
对象索引值,这个索引值通常介于 0到
Count属性值 -1之间。
2 Field对象
Field对象是负责记录记录集对象的
每一项字段相关属性,Field对象所提供
的属性、方法及数据集合包括 Name属性、
Value属性,Type属性,Attribute属性、
NumericScale属性,Precision属性、
ActualSize属性,DefineSize属性、
OriginalValue属性,UnderlyingValue属
性,AppendChunk方法,GetChunk方法及
Properties数据集合等,分述如下,
Name属性:该属性表示对象属性的名称。
Value属性:该属性表示对象属性的属性
值。
Type属性:该属性表示对象属性的数据
类型,与 Property对象的 Type属性相同。
Attributes 属性和 Properties 集合:
可决定对于给定字段哪些类型的功能受到
支持。
NumericScale,该属性表示数据字段所
被允许存储的数字个数。
Precision属性:该属性表示数据字段所
被允许的最大数字,通常表示此数据字段
的有效数字。
ActualSize 属性:该属性可返回给定字
段中数据的实际大小。
DefinedSize 属性:该属性可返回已声
明的字段大小。
OriginalValue属性:该属性表示数据字
段的内容是从第一次启动或是在调用
Update方法前的值。
UnderlyingValue属性:该属性表示数据
库中所取出来的数据与 OriginalValue属
性有所不同。
AppendChunk方法和 GetChunk方法:可处
理包含长二进制或长字符数据的字段值。
?8.3.5 记录集对象的使用
综合使用记录集对象的属性和方法
可以编写出功能强大的数据库应用程序。
利用记录集对象中的一些属性,可以精确
地控制记录指针的行为,提高检索和更新
数据的能力。尽管连接对象和命令对象简
化了连接数据库和查询任务,但它们与记
录集对象相比仍有许多不足。所有一般的
ASP应用程序均使用记录集对象来管理检
索和修改数据。由于记录集对象的 AddNew、
Delete,Update方法操作数据集的效率较
低,推荐使用 SQL语句来完成相应操作。
1 用记录集显示记录
记录集可以用来代表表中的记录 。 与
表一样, 一个记录集包含一条或多条记录
( 行 ), 每个记录包括一个或多个域 ( 字
段 ) 。 在任何时刻, 只有一条记录是当前
记录 。
要创建记录集对象的一个实例, 可以
使用连接对象的 Execute()方法 。 当使用
Execute()方法从一个数据库返回查询结
果时, 一个记录集对象就会被自动创建 。
这里有一个例子,
<%
Set MyConn=Server.CreateObject("ADODB.Connection")
MyConn.Open "dsn=vod;uid=sa;pwd=password;"
Set RS=MyConn.Execute("SELECT * FROM member")
RS.Close
MyConn.Close
%>
在这个脚本中, 使用一个 SQL SELECT语
句从一个表 member中返回了所有的记录 。
Execute()方法返回一个记录集 。 该记录
集被分配给变量 RS,然后关闭了这个记录
集 。 最后, 关闭与数据库的连接 。
记录集中的每一条记录都对应于表
member中的一条记录 。 要显示记录集中的
所有记录, 只要简单地做一个循环就可以,
正如上一章的程序 sample9-03.asp所示 。
在程序 sample9-03.asp的脚本中,DO
WHILE… LOOP循环用来扫描记录集 RS中的
每一条记录,把每个记录的 hy_name字段
值输出到浏览器。这段脚本显示了表
member中的所有记录。
当在一个记录集对象中收集了数据
后, 当前记录总是第一条记录 。 程序
sample10-03.asp调用了记录集对象的
MoveNext方法, 使当前记录移到下一条记
录 。 当所有的记录都显示完时, 记录集对
象的 EOF属性的值将变为 true,从而退出
DO WHILE… LOOP循环 。
一个记录集对象有一个域集合,包
含一个或多个域对象。一个域对象代表表
中的一个特定的字段。例如,在 sample9-
03.asp的脚本中,使用了表达式
RS("hy_name")来显示字段 hy_name。 实际
上,可以通过许多中途径显示一个字段的
值。下面的每一个表达式都可以显示字段
hy_name的值,
RS("hy_name")
RS(0)
RS.Fields("hy_name")
RS.Fields(0)
RS.Fields.Item("hy_name")
RS.Fields.Item(0)
这里既可以通过字段名,也可以通过顺序号
来指定一个字段。即使用 RS("hy_name")或 RS(0)
来代表字段 hy_name,两种方法起到同样的效果,
因为字段 hy_name对应于表中的第一个字段(第
一个字段的顺序号是 0)。
当不知道一个记录集中的字段名时, 通过顺
序号指定一个域是有用处的 。 例如, 下面的
sample8-10.asp脚本显示了一个表中的所有记
录的所有字段 。
程序见书中 sample8-10.asp
在这个例子中, 域集合的 Count属性用来返回
该记录集中的域的数目 。 Name属性用来返回每
个域的名字 。 两个 FOR… NEXT循环用来对记录集
中的所有字段进行操作 。 不论表中有多少记录
和字段, 它们将被全部显示 。 程序执行结果如
图 8-16所示 。
图 8-16 sample8-10.asp运行结果
2 对记录集进行分页
当检索到大量记录数据后, 在有限
的空间内不能显示检索到的全部记录数据,
必须将检索到的全部记录分页显示才能满
足实际需要 。 目前每个网站均有关键字查
询功能, 所以该功能是建立网站所必须的 。
比如要显示 VOD点播系统节目单,从
方便用户的角度考虑,就不应该把所有的
节目都显示在同一个 ASP页中,这时将允
许点播节目的会员进行翻页显示。
将数据库的查询结果分页显示的方法有很
多, 但主要有两种,
( 1) 将数据库中所有符合查询条件的记录
一次性的都读入到 recordset,存放在内
存中, 然后通过 ADO Recordset 对象所提
供的几个专门支持分页处理的属性, 如
PageSize( 页大小 ), PageCount( 页数
目 ) 以及 AbsolutePage( 绝对页 ) 来管理
分页处理 。
( 2)根据客户的指示,每次分别从符合
查询条件的记录中将规定数目的记录数读
取出来并显示。
两者的主要差别在于前者是一次
性将所有记录都读入内存, 然后再根据指
示来依次做判断分析, 从而达到分页显示
的效果;而后者是先根据指示做出判断,
并将规定数目的符合查询条件的记录读入
内存, 从而直接达到分页显示的功能 。
可以很明显地感觉到,当数据库中
的记录数达到上万或更多时,第一种方法
的执行效率将明显低于第二种方法,因为
当每一个客户查询页面时都要将所有符合
条件的记录存放在服务器内存中,然后在
进行分页等处理,如果同时有超过 100个
的客户在线查询,
那么 ASP 应用程序的执行效率将大
受影响 。 但是, 当服务器上数据库的记录
数以及同时在线的人数并不是很多时, 两
者在执行效率上是相差无几的, 此时一般
就采用第一种方法, 因为第一种方法的
ASP程序编写相对第二种方法要简单明了
得多 。
要把一个记录集分成多个页,可以
用 PageSize属性指定一页中的记录个数。
然后用 AbsolutePage属性移动到一个特定
的页。最后,用 PageCount属性返回总页
数。程序 sample8-11.asp使用的是第一种
分页显示方法。程序见书中 sample8-
11.asp
这个 ASP网页一次显示表 member中的
五条记录一个 session变量 Currentpage被
用来跟踪记录集的当前页。当用户单击
NEXT时,就显示下一页记录,当用户单击
PREV时,就显示上一页。
程序执行结果如图 8-17所示