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对象的常用方法
一般把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所示。
图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所示。
图7-15 7-5.asp调试结果
在实际网站的用户注册过程中,必须先判断用户名是否存在,若已经存在就不能以此用户名注册新用户;用户密码通常也要经过加密(通常为MD5加密算法)后再存入数据库表内;用户名必须合法,如不得有某些特定的字符,不能过长或过短;密码必须输入两次,两次输入的密码相同时才能注册等。
(3)删除记录的ASP网页。
与添加记录一样,删除记录也不需要返回记录集,直接使用Connection对象的Execute方法来执行SQL语句Delete就可以了。
表7-1 用户信息表
-----------------------------清单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所示。
图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所示。
图7-17 7-7.asp调试结果
再运行7-4.asp,即可查看到users表的内容如下。
在实际网站中,修改密码要先判断用户的权限,若权限不够则不得修改。
3. Recordset对象的属性与应用
Recordset对象的属性用得不是很多,但要想随心所欲地操纵记录,就要用到Recordset对象的属性。常用属性如表7-3所示。
表7-3 Recordset对象的常用属性
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所示。
图7-18 7-8.asp的调试结果
表7-4 CursorLocation参数取值及说明
语法格式如下:
Recordset对象.CursorLocation= 整数值( 1|2|3 )
一般情况下,我们不关心记录集在哪里处理,不过恰当地设置该属性,可以使资源得到优化,比如为了减轻服务器的负担,可以把记录集放在客户端处理。
(6)Filter属性:用于设置欲显示的内容,取值及说明如表7-5所示。
表7-5 Filter参数取值及说明
语法格式如下:
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所示。
图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所示。
图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&"条 " '共多少条记录
response.write rs.PageCount&"页 " '共分多少页
response.write pageNo&"/"&rs.PageCount&"页 "
'当前页的位置
dim i 'i作为循环变量
for i=1 to rs.PageCount
if i=pageNo then
response.write i&" " '如果i是当前页,输出i,不跳转
else '如果i不是当前页,跳转到新的页
response.write "<a
href='7-10.asp?pageNo="&i&"'>"&i&"</a> "
end if
next
%> </td>
</tr>
</table>
</body>
</html>
<%
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
--------------------------------------------------------------------
调试结果如图7-21所示。
图7-21 ASP网页内容分页显示的结果
此程序有些复杂,特作如下说明。
(1)程序的中心思想是每一次选择要显示的页数,然后将该参数返回给本程序。
(2)a部分建立Recordset对象rs,如果URL没有带参数,则显示第一页。
(3)b部分是程序的重点和难点:先设置每页显示的记录数为2,然后根据pageNo的值将指针指向相应的页。当指针指向每一页的时候,其实就是指向该页的第一条记录,然后利用循环依次显示该页的每一条记录。
(4)注意d部分的循环:用循环将记录集里的记录逐条显示出来。如果指针指向某页的最后一条记录时,还继续使用MoveNext方法,则指针就指向下一页的第一条记录。因此,在每页的循环条件中要判断两种结尾,一种是分页的结尾pageS>0,另一个是最后一页可能只有一条记录,因此还要判断是否是整个记录的结尾rs.Eof。
在Internet上,有很多ASP的资源可以利用,比如分页,上传、UBBCode等免费源代码供我们使用,灵活地利用这些源代码可以提高ASP程序编写的速度。分页也可以使用类来实现,这些类的源代码已编写好了,可以直接下载使用,再新建对象就可以很容易地进行分页显示了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。