首页 百科知识 Recordset对象及应用

Recordset对象及应用

时间:2022-12-13 百科知识 版权反馈
【摘要】:记录集对象Recordset是ADO中极为重要且普遍使用的对象,负责从数据库中取得所需的记录,并创建一个记录集合。所有的Recordset对象都是通过记录(行)和字段(列)构造的,通过Recordset对象可对数据进行操作。但在任何时候,Recordset对象所指的当前记录均为记录集内的单个记录。通常,Recordset对象也需要使用Server对象的CreatObject方法来创建,然后对该对象进行相应的操作。因为将select查询结果保存在Recordset对象——rs里面,并没有在客户端浏览器里显示。

7.3.3 Recordset对象及应用

记录集对象Recordset是ADO中极为重要且普遍使用的对象,负责从数据库中取得所需的记录,并创建一个记录集合。所有的Recordset对象都是通过记录(行)和字段(列)构造的,通过Recordset对象可对数据进行操作。但在任何时候,Recordset对象所指的当前记录均为记录集内的单个记录。

1. 建立Recordset对象

通常,Recordset对象也需要使用Server对象的CreatObject方法来创建,然后对该对象进行相应的操作。建立Recordset对象的语法格式如下:

Set Recordset对象=Server.CreatObjoct("ADODB.Recordset")

例如,Set rs= Server.CreatObjoct("ADODB.Recordset")

下面介绍如何使用Recordset对象的方法与属性对数据库的访问操作。

2. Recordset对象的方法

Recordset对象有许多方法,这些方法提供了一些与记录集相关的操作,Recordset对象的主要方法如表7-2所示。


表7-2 Recordset对象的常用方法

img460

一般把Recordset对象的常用方法分为两大组。

第一组是关于Recordset对象的打开与关闭,方法如下。

(1)Open方法。

前面已经多次使用过该方法,它的作用是打开记录集,还可以带几个参数,语法格式如下:

Recordset对象.Open [Source],[ActiveConnection],[CursorType],[LockType],[Options]

关于参数意义请参照7.3.2节的内容。

(2)Close方法。

该方法用于关闭Recordset对象,语法格式如下:

Recordset对象.Close

与Connection对象的关闭方法一样,及时关闭它们是一个好习惯。

(3)Requery方法。

该项方法用于重新打开记录集,相当于关闭再打开,语法格式如下:

Recordset对象. Requery

第二组,主要用来移动记录指针

(1)MoveFirst方法。

该方法用于将记录指针移动到第一条记录,语法格式如下:

Recordset对象. MoveFirst

(2)MovePrevious方法。

该方法用于将记录指针移动到上一条记录,语法格式如下:

Recordset对象. MovePrevious

(3)MoveNext方法。

该方法用于将记录指针移动到下一条记录,语法格式如下:

Recordset对象. MoveNext

(4)MoveLast方法。

该方法用于将记录指针移动到最后一条记录,语法格式如下:

Recordset对象. MoveLast

(5)Move方法。

该方法用于将指针移动到指定的记录,语法格式如下:

Recordset对象. Move number,start

其中,start:设置指针移动的开始位置,如省略默认为当前指针的位置;number:从start设置的起始位置向前或向后移动number条记录,如果number为正整数,则表示向下移动,如果为负整数,则表示向上移动。

下面来学习Recordset的Open方法。

Recordset对象的Open方法用来打开指定的数据库,执行SQL语句,如果有返回结果,则将结果记录集保存在Recordset对象实例中,语法格式如下:

Recordset对象.Open [Source],[ActiveConnection],[CursorType],[LockType],[Options]

其中,Source表示数据来源,通常是一段SQL语句;

ActiveConnection表示所使用的连接,通常是一个Connection对象实例(如前面已建立的Connection对象实例:conn);CursorType表示打开Recordset记录集时所使用的游标类型,默认值为0,此时记录集指针只能向下移动,且不能修改记录;若设置为1,则记录集指针可以向上或向下自由移动,也可以对记录进行更新和删除;

LockType表示锁定信息;

Options表示数据库查询信息类型。

在大部分情况下,可以省略后3个参数。若要省略中间的某个参数,后面参数不省略,则必须用逗号给出中间参数的位置,也就是说,每一个参数必须对应相应的位置,例如,

rs.Open "select ∗ from Users",conn,,2

下面为建立一个 Recordset 对象的实例。

-----------------------------清单7-3 7-3.asp------------------------

<!--#include file="conn.asp" -->

<%

dim rs

set rs=Server.CreateObject("ADODB.Recordset")'建立Recordset对象实例rs

rs.Open "Select ∗ from Users",conn '执行SQL语句,将返回结果保存在rs中

%>

--------------------------------------------------------------------

该例调试后,没有结果显示。因为将select查询结果保存在Recordset对象——rs里面,并没有在客户端浏览器里显示。

建立Recordset 对象以后,就可以查询、插入、删除或更新数据表的记录。

(1)查询并显示数据表信息的ASP网页。

查询数据表里的记录的SQL命令是Select,当使用Recordset对象的Open方法执行完Select语句,建立了记录集以后,有一个指针指向第一条记录,从记录集里提取当前记录某个字段的格式如下:

记录集对象名("字段名")

要读取其他记录,可以移动指针来改变当前记录,然后读取当前记录的信息。

在网页中显示数据库表的内容,从Recordset对象提出记录集,编写一个ASP网页。为了使源代码显得整齐美观,采用将ASP脚本嵌入HTML代码中,网页代码如下。

------------------------- 清单7-4 7-4.asp ---------------------------

<!--#include file="conn.asp" -->

<%

dim rs

set rs=Server.CreateObject("ADODB.Recordset")

rs.Open "Select ∗ from Users",conn

%>

<html>

<head><title>用recordset查询并显示数据表信息</title></head>

<body>

<table border="1">

<caption>用户信息表</caption> '显示表名

<tr height="30" bgcolor="#808080">

<td>ID</td>       '显示表头字段名

<td>name</td>

<td>depts</td>

<td>pwd</td>

<td>grade </td>

</tr>

<% do while not rs.eof   '只要不是表的结尾就执行循环 %>

<tr>

<td><%=rs("ID")%></td>  '显示一条记录

<td><%=rs("name")%></td>

<td><%=rs("depts")%></td>

<td><%=rs("pwd")%></td>

<td><%=rs("grade")%></td>

</tr>

<% rs.movenext  '将记录指针向下移动一条记录

loop       '与前面的do while语句配对,构成循环结构

rs.close     '关闭Recordset对象rs,要先关闭rs,然后再关闭conn

set rs=nothing  '从内存中清除rs

conn.close   '关闭connection对象conn

set conn=nothing '从内存中清除conn

%>

</table>

</body>

</html>

--------------------------------------------------------------------

调试该网页,结果如图7-14所示。

img461


图7-14 7-4.asp调试结果

这里使用了循环语句do while…loop来依次读取记录集保存的值。每读取一次后,用rs.moveNext语句使指针移动指向下一条记录,若指针指向表的末尾,则退出循环。循环体为表格的行,若数据库表中有5条记录,则循环5次,与一个表头一起构成6行的表格。注意,这里的循环结构语句尽管分布在几个不同的<%……%>里,但它们依然构成一个循环整体。

<%=rs("ID")%>等效于<% Response.write rs("ID")%>,当一个<% %>内只输出某一个变量或表达式时,可以把Response.write省写成“=”,此时它们有相同的作用。

(2)往数据表里添加记录的ASP网页。

譬如,要在数据库表Users中添加一条记录,使用SQL语句Insert就可以。

一般来说,添加记录不需要返回记录集,可以不使用Recordset 对象,直接使用Connection对象的Execute方法来执行相关的SQL语句就可以了。例如,在Users表中加入一条新记录:

<!--#include file="conn.asp" -->

<%

conn.Execute"insert intousers(ID,name,depts,pwd,grade)Values('5','王八仙','数学系', '889', '1')"

%>

双引号里面还有双引号时,如"王八仙",把它放在SQL语句的双引号里面后,就要把里面的双引号转换为单引号。也就是说,双引号里面不能再有双引号,要改成单引号才行。

有时候需要了解Execute方法在本次操作中影响的记录条数,可以使用number参数,语法格式为:

Connection对象.Execute SQL语句串,number

此时number参数返回此次操作所影响的记录条数。将这行代码改写后,加入网页中,形成一个添加记录的ASP网页,代码如下。

----------------------------清单7-5 7-5.asp-------------------------

<!--#include file="conn.asp" -->

<%

conn.Execute"insert into users(ID,name,depts,pwd,grade)Values(5,'王八仙','数学系', '889', 1)",number

Response.write"本次操作共添加 "&number&" 条记录"

%>

--------------------------------------------------------------------

调试结果如图7-15所示。

再运行7-4.asp,查看到添加记录后的数据表如表7-1所示。

img462


图7-15 7-5.asp调试结果

在实际网站的用户注册过程中,必须先判断用户名是否存在,若已经存在就不能以此用户名注册新用户;用户密码通常也要经过加密(通常为MD5加密算法)后再存入数据库表内;用户名必须合法,如不得有某些特定的字符,不能过长或过短;密码必须输入两次,两次输入的密码相同时才能注册等。

(3)删除记录的ASP网页。

与添加记录一样,删除记录也不需要返回记录集,直接使用Connection对象的Execute方法来执行SQL语句Delete就可以了。


表7-1 用户信息表

img463

-----------------------------清单7-6 7-6.asp------------------------

<!--#include file="conn.asp" -->

<% conn.Execute "Delete From users where name='王八仙'",number %>

<html>

<head><title>删除记录数</title></head>

<body>

本次操作共有 <%=number%> 条记录被删除

</body>

</html>

--------------------------------------------------------------------

调试结果如图7-16所示。

img464


图7-16 7-6.asp的调试结果

(4)修改数据表记录的ASP网页。

修改用户的密码的代码如下。

----------------------------清单7-7 7-7.asp-------------------------

<!--#include file="conn.asp" -->

<% conn.Execute "Update users set pwd='ppwwdd' where name='李四'",number

%>

<html>

<head><title>修改记录</title></head>

<body>

本次操作共有 <%=number%> 条记录被修改

</body>

</html>

--------------------------------------------------------------------

调试结果如图7-17所示。

img465


图7-17 7-7.asp调试结果

再运行7-4.asp,即可查看到users表的内容如下。

img466

在实际网站中,修改密码要先判断用户的权限,若权限不够则不得修改。

3. Recordset对象的属性与应用

Recordset对象的属性用得不是很多,但要想随心所欲地操纵记录,就要用到Recordset对象的属性。常用属性如表7-3所示。


表7-3 Recordset对象的常用属性

img467

Recordset对象的属性可以根据功能大致分成三组。

1)第一组属性功能

第一组属性主要限定记录集的内容和性质,这一组属性通常需要在打开记录集(使用Open方法)以前设置。

(1)Source属性:用于设置数据库查询信息,可以是Command对象名、SQL语句或表名等。

语法格式如下:

Recordset对象.Source=数据库查询信息

例如,

<%

Dim rs

set rs=Server.CreateObject("ADODB.Recordset")

rs.Source= "Select ∗ from Users"

response.Write rs.Source

%>

(2)ActiveConnection属性:用于设置数据库连接信息,可以是Connection对象名或包含数据库连接信息的字符串。

语法格式如下:

Recordset对象.ActiveConnection=数据库连接信息

(3)CursorType属性:用于设置记录集指针类型。

语法格式如下:

Recordset对象. CursorType=取值(0|1|2|3)

若不设置,默认值是0,指针只能向前移动,要想指针可以自由前后移动,一般设为1 或2。

(4)LockType属性:用于设置记录集的锁定类型。

语法格式如下:

Recordset对象.LockType=取值( 1|2|3|4 )

若不设置,默认值是1,表示只能读取。前面说过执行添加、修改等操作时不需要用Recordset对象,但利用Recordset对象也可以执行添加、删除、更新等操作,不过这时就要设置该属性,一般设置为2。

用下面例子来说明前面四个属性的用法,使用这四个属性来改写7-1.asp,代码如下。

----------------------------清单7-8 7-8.asp-------------------------

<!--#include file="conn.asp" -->

<%

dim rs

set rs=Server.CreateObject("ADODB.Recordset")

rs.Source="Select ∗ from Users"

rs.ActiveConnection=conn

rs.CursorType=0  '0为默认值,此句可以省略

rs.LockType=1  '1为默认值,此句可以省略

rs.Open

do while not rs.eof

Response.write rs("ID")& rs("name")& rs("depts")& rs("pwd")&

rs("grade")& "<br/>"

rs.movenext

loop

rs.close

set rs=nothing conn.close

set conn=nothing

%>

--------------------------------------------------------------------

调试结果如图7-18所示。

从以上例子可以看出,使用Recordset对象的这几个属性与设置Open方法的参数的效果是一样的,它们具有相同的作用。

(5)CursorLocation属性:用于设置记录集在客户端还是在服务器端处理,取值及说明如表7-4所示。

img468


图7-18 7-8.asp的调试结果


表7-4 CursorLocation参数取值及说明

img469

语法格式如下:

Recordset对象.CursorLocation= 整数值( 1|2|3 )

一般情况下,我们不关心记录集在哪里处理,不过恰当地设置该属性,可以使资源得到优化,比如为了减轻服务器的负担,可以把记录集放在客户端处理。

(6)Filter属性:用于设置欲显示的内容,取值及说明如表7-5所示。


表7-5 Filter参数取值及说明

img470

语法格式如下:

Recordset对象.Filter=取值( 0|1|2|3 )

2)第二组属性

第二组属性包括RecordCount、Bof、Eof这三个属性,该组属性主要是关于记录的,它们一般只能在打开记录集后再读取,而不能设置。

(1)RecordCount属性:用于返回记录集中的记录总数。

语法格式如下:

Recordset对象.RecordCount

一个统计Users表中记录总数的代码如下。

----------------------------清单7-9 7-9.asp------------------------

<!--#include file="conn.asp" -->

<%

dim rs

set rs=Server.CreateObject("ADODB.Recordset")

rs.Open "Select ∗ from Users",conn,1

Response.Write "user数据表共有 "&rs.RecordCount&" 条记录"

%>

--------------------------------------------------------------------

使用该属性时,必须设置指针类型CursorType为1或3,否则会出错。

调试结果如图7-19所示。

img471


图7-19 7-9.asp调试结果

(2)Bof属性:用于判断当前记录指针是否在记录集的开头(第一条记录之前),在开头返回True,否则返回Flase。

(3)Eof属性:用于判断当前记录指针是否在记录集的结尾(最后一条记录之后),在结尾则返回True,否则返回Flase。

如果记录集为空,可以认为记录集指针指在开头,也在结尾。Bof和Eof属性的值都为True,常用此属性来判断记录集是否为空。例如,

<%……

rs.Open……

if rs.Eof and rs.Bof Then

response.write"没有找到相关的记录"

……

end if

%>

3)第三组属性

第三组属性主要用来完成数据分页显示的功能,这一组属性通常在打开记录集后再设置。

(1)PageSize属性:用于设置数据分页时第一页的记录数。

语法格式如下:

Recordset对象.PageSize=整数

(2)PageCount属性:用于设置数据分页显示时数据页的总数。

语法格式如下:

Recordset对象.PageCount

(3)AbsolutePage属性:用于设置当前指针位于哪一页。

语法格式如下:

Recordset对象.AbsolutePage=整数

该整数应该小于数据页的总数。

(4)AbsolutePostion属性:用于设置当前指针所在的记录行的绝对值。

语法格式如下:

Recordset对象. AbsolutePostion=整数

使用这几个属性完成数据分页时,一般把CursorType设置为1。下面举例学习如何使用四个属性进行数据分页显示。

当要显示的数据较多时,往往把数据分成多页来显示,用户可以一页一页地浏览。例如,某大学的新闻就有很好的分页显示功能,如图7-20所示。

img472


图7-20 分页显示网页

要进行分页,就要用到前面介绍过的Recordset对象的第三组属性:PageSize、PageCount 和AbsolutePage。PageSize是每一页的记录数,PageCount是数据页总数,AbsolutePage指向当前数据页。具体请参看表7-3。下面看一个ASP分页显示的例子,在7-4.asp中加入分页显示的功能。

--------------------------清单7-10 7-10.asp-------------------------

<!--#include file="conn.asp" -->

<html>

<head><title>分页显示Users中的数据</title></head>

<body>

<%

'------------------a 记录集rs----------------------------

dim rs

set rs=Server.CreateObject("ADODB.Recordset")

rs.Open "Select ∗ from Users",conn,1

'---如果第一次打开,不带URL参数pageNo,则显示第一页----------

Dim pageNo,pageS

if Request.querystring("pageNo")="" Then

pageNo=1

else

pageNo=cInt(request.querystring("pageNo"))

end if

'----------------b-------设置分页参数----------------------------

'开始分页显示,指向要显示的页,然后逐条显示当前的所有记录

rs.PageSize=2      '设置每页显示两条记录

pageS=rs.PageSize    'PageS变量用来控制显示当前页记录

rs.AbsolutePage=pageNo '设置当前显示第几页

%>

<!---------------c-------表头内容------------------------->

<table border="1" width="300">

<caption>用户信息表</caption>

<tr height="30" bgcolor="#808080">

<td>ID</td>

<td>Name</td>

<td>Depts</td>

<td>Pwd</td>

<td>Grade</td>

</tr>

<%

'------------------d---表中的内容,用循环实现--------------

Do while not rs.Eof and pageS>0 %>

<tr>

<td><%=rs("ID")%></td>

<td><%=rs("name")%></td>

<td><%=rs("depts")%></td>

<td><%=rs("pwd")%></td>

<td><%=rs("grade")%></td>

</tr>

<%

rs.moveNext

pageS=pageS-1

Loop

%>

<!-----e--------显示页数的一行存在链接的文字------>

<tr>

<td colspan="6" align="right">

<%

response.write rs.RecordCount&"条&nbsp;" '共多少条记录

response.write rs.PageCount&"页&nbsp;"   '共分多少页

response.write pageNo&"/"&rs.PageCount&"页&nbsp;"

'当前页的位置

dim i  'i作为循环变量

for i=1 to rs.PageCount

if i=pageNo then

response.write i&"&nbsp;" '如果i是当前页,输出i,不跳转

else               '如果i不是当前页,跳转到新的页

response.write "<a

href='7-10.asp?pageNo="&i&"'>"&i&"</a>&nbsp;"

end if

next

%>  </td>

</tr>

</table>

</body>

</html>

<%

rs.close

set rs=nothing

conn.close

set conn=nothing

%>

--------------------------------------------------------------------

调试结果如图7-21所示。

img473


图7-21 ASP网页内容分页显示的结果

此程序有些复杂,特作如下说明。

(1)程序的中心思想是每一次选择要显示的页数,然后将该参数返回给本程序。

(2)a部分建立Recordset对象rs,如果URL没有带参数,则显示第一页。

(3)b部分是程序的重点和难点:先设置每页显示的记录数为2,然后根据pageNo的值将指针指向相应的页。当指针指向每一页的时候,其实就是指向该页的第一条记录,然后利用循环依次显示该页的每一条记录。

(4)注意d部分的循环:用循环将记录集里的记录逐条显示出来。如果指针指向某页的最后一条记录时,还继续使用MoveNext方法,则指针就指向下一页的第一条记录。因此,在每页的循环条件中要判断两种结尾,一种是分页的结尾pageS>0,另一个是最后一页可能只有一条记录,因此还要判断是否是整个记录的结尾rs.Eof。

在Internet上,有很多ASP的资源可以利用,比如分页,上传、UBBCode等免费源代码供我们使用,灵活地利用这些源代码可以提高ASP程序编写的速度。分页也可以使用类来实现,这些类的源代码已编写好了,可以直接下载使用,再新建对象就可以很容易地进行分页显示了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈