第一步,指定想要连接的数据库,有 DSN 和 DSN-less 两种方法。
ASP访问数据库
DSN(Data Source Name 数据源名称 ),建立一个系统数据源名称方法如下,
1、单击,开始,,选设置控制面板。
2、双击图标,32 位 ODBC”,将弹出一个对话框,选标签
,System DSN”
3,单击,Add”添加一个 DSN 入口,选择如,Microsoft
Access Driver”并确认。
4、在,Data Source Name”栏里输入你希望指定的 DSN,然后单击,Select”选择数据库存放位置,你可以按,Browse”来选取。
5、以上步骤完成后在 ASP 程序中指定 DSN,如下,
< %connstr = "FILEDSN=MyDatabase.dsn"%>
注意:无论在等号 (=)之前还是之后,DSN字符串都不能包含空格。
DSN-less,是另一种通过在 ASP 文件里直接指定数据库文件所在位置,而无需建立 DSN 的方法。由于许多公司没有自己的 WEB 服务器,他们的网站往往是存放在远端的虚拟服务器上,因此要建立和修改 DSN
的设置比较麻烦。而使用 DSN-less 方法直接指定远端数据库所在位置恰恰解决了这一问题,方法如下,
< %
connstr =
"DBQ="+server.mappath("database/source.mdb")+";DefaultDir
=;DRIVER={Microsoft Access Driver
(*.mdb)};DriverId=25;FIL=MS
Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanR
ows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCom
mitSync=Yes;"
%>
<%
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
server.mappath("data/database.mdb")
'如果你的服务器采用较老版本 Access驱动,请用下面连接方法
'connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" &
server.mappath("data/database.mdb")
%>
指定了想要连接的数据库后,就可以通过以下方法连接并打开数据库,
< %
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open connstr
%>
第二步,指定想要执行的 SQL 指令,可以使用 RecordSet。
当连接了数据库后就可以对数据库进行操作,比如增加、
删除、查询,更新等等,这些操作都是通过 SQL 指令来完成的,如下例在数据库表 database 中查询所有姓名中有
,A”的记录,
< %
Set rs = Server.CreateObject("ADODB.Recordset")
sql="select * from database where name like '%A%'"
rs = Conn.Execute(sql)
Conn.close
%>
<%
strSQL = "INSERT INTO Customers (FirstName,
LastName) VALUES ('Jose','Lugo')"
Conn.Execute(strSQL)
%>
<%
Conn.Execute "UPDATE Customers SET FirstName =
'Jeff? WHERE LastName = 'Smith' "
%>
<%
Conn.Execute "DELETE FROM Customers WHERE
LastName = 'Smith'"
%>
尽管 Connection 对象简化了连接数据库和查询任务,但 Connection 对象仍有许多不足 。确切地说,检索和显示数据库信息的 Connection 对象不能用于创建脚本,编程者必须确切知道要对数据库作出的更改,然后才能使用查询实现更改。
对于检索数据、检查结果、更改数据库,ADO
提供了 Recordset 对象 。
Recordset 对象检索并且显示一组数据库行,即记录,Recordset
对象保持查询返回的记录的位置,允许一次一项逐步扫描结果。
根据 Recordset 对象的指针类型属性设置,可以滚动和更新记录。
数据库指针可以在一组记录中定位到特定的项,还用于检索和检查记录,然后在这些记录的基础上执行操作。
Recordset 对象有一些属性,可用于精确地控制指针的行为,提高检查和更新结果的能力。
例如,Recordset 的使用方法如下
Recordset 对象
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL 指令,Conn,1,1 ' 读取或
rs.Open SQL 指令,Conn,1,3 ' 新增、修改、或删除
Recordset对象 Open方法 的格式:
recordset.Open Source,ActiveConnection,
CursorType,LockType,Options
ActiveConnection,Recordset对象可以通过 ActiveConnection属性来连接 Connection对象 。
ActiveConnection可以是一个 Connection对象 或是一串包含数据库连接信息 ( ConnectionString) 的字符串参数。
Open后面的参数均为可选项参数说明
Source,Recordset对象可以通过 Source属性来连接 Command
对象 。 Source参数可以是一个 Command对象名称,一段 SQL命令,
一个指定的 数据表名称 或是一个 Stored Procedure。 假如省略这个参数,系统则采用 Recordset对象的 Source属性 。
打开一个静态类型 rdoResultset 对象。adOpenStatic
打开一个键集类型 rdoResultset 对象。
adOpenDynamic 打开一个动态类型 rdoResultset 对象。
adOpenKeyset
打开一个仅向前类型 rdoResultset对象。
即只可以从头到尾搜索行 (缺省值 )
adOpen
ForwardOnly
说 明常 量
CursorType,确定提供者打开 Recordset 时应该使用的游标类型 。 可为下列常量之一健相当于书签,只可根据健集的健值,添加、改变或删除基础数据库表或表的行。 获取更新行的查询结果。
不支持健,是行的动态集合,
动态添加改变或删除基础数据库表或表的行。 获取更新行的查询结果。
打开客户端 Recordset 对象时唯一允许使用的游标类型,这个游标使用的结果集合中的成员关系,顺序和值通常是固定的 。 相当于 结果集 的副本观察不到动态变化
LockType,参数指定锁定类型以支持并发,参数 可为下列常量之一开放式批更新 — 用于批更新模式(与立即更新模式相对)。
adLockBatch
Optimistic
开放式锁定(逐个) — 只在调用 Update 方法时才锁定记录。
adLock
Optimistic
保守式锁定(逐个) — 为确保成功编辑记录,
在编辑时立即锁定数据源的记录。
adLock
Pessimistic
只读 — 不能改变数据。(默认值)adLock
ReadOnly
说 明常 量
Options,指示提供者如何计算 Source 参数,
或从以前保存 Recordset 的文件中恢复
Recordset。可为下列常量之一指示提供者应该将 Source 视为存储的过程。
adCmdStoredProc
指示提供者应从 CommandText 命名的表中返回所有行。
adCmdTableDirect
指示 ADO 生成 SQL 查询以便从 Source
命名的表返回所有行。
adCmdTable
指示提供者应该将 Source 作为命令的文本定义来计算。
adCmdText
说 明常 量指示在提取 CacheSize 属性中指定的初始数量后,应该异步提取所有剩余的行。
adFetchAsync
指示应异步执行 Source。adExecuteAsync
指示应从 Source 命名的文件中恢复持久保存的 Recordset。
(默认值)
adCommandFile
指示 Source 参数中的命令类型为未知。
adCmdUnknown
说 明常 量第三步,使用 RecordSet 属性和方法,并显示执行的结果。
通过以上指令,创建了一个包含数据的游标 RecordSet)“rs”,
事实上游标是存储在活动内存中的 类似记录和字段的数组 的东西,
当通过 RecordSet 组件创建一个游标时,它从数据提供者得到一个数据集,并用它来充实游标。
ADO 产生的 RecordSet 是一个象 电子表格 的记录,它有一行行的记录,在任何时候都有一行是它的当前行,而 RecordSet
的字段是用 RecordSet 的 Field 集合表示的。
下面列出了 RecordSet 对象 的一些属性和方法,
rs.Fields.Count,RecordSet 对象的字段总数。
rs(i).Name,第 i 个字段的名称,i 由 0 算起到
rs.Fields.Count-1。
rs(i),读取第 i 个字段的数据,i 由 0 算起到 rs.Fields.Count-1。
rs(" 字段名称 "),读取指定字段的数据。
rs.RecordCount,游标中的数据记录总数。
rs.EOF,是否已指到最后一条记录。
rs.MoveNext,将指标移到下一笔记录。
rs.MovePrev,将指标移到上一笔记录。
rs.MoveFirst,将指标移到第一笔记录。
rs.MoveLast,将指标移到最后一笔记录。
rs.Close,关闭 RecordSet 对象
例 26 与数据库建立连接( 9-26.asp)
9-26.asp的代码如下:
ASP访问数据库实例
<% @ LANGUAGE=VBScript %>
<%
Option Explicit
Dim Cnn,StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" &Server.MapPath("bbs.mdb;")
Cnn.Open StrCnn
Response.Write Server.MapPath("bbs.mdb") & "<br>"
Response.Write "数据库连接成功," & Cnn.State & "<br>"
Cnn.close
Response.Write "数据库已经关闭," & Cnn.State
Set Cnn = Nothing
%>
创建 Connection 对象使用 Connection 对象的 Open 方法打开数据库 bbs.mdb,该数据库用户自己建立使用 Connection 对象的Close 方法关闭连接将 Connection 对象从内存中删除,以释放资源
9-26.asp的 运行结果如图
例 9.27 循环检索记录( 9-27a.asp和 9-27b.asp)
注意,先注册文件数据源为 Myaa.dsn,使用的数据库为
northwind.mdb。
ASP访问数据库实例
<%
strDSN = "FILEDSN=Myaa.dsn"
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open strDSN
Set rsCustomers = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT 联系人姓名,公司名称 FROM 客户 WHERE 客户 ID=
'FAMIA' "
rsCustomers.Open strSQL,cn
Set objFirstName = rsCustomers("联系人姓名 ")
Set objLastName = rsCustomers("公司名称 ")
Do Until rsCustomers.EOF
Response.Write objFirstName & "-------- " & objLastName & "<BR>"
rsCustomers.MoveNext
Loop
%>
9-27a.asp的代码如下:
初始化 Recordset对象循环查询,并显示结果
<%
strDSN = "FILEDSN=Myaa.dsn"
strSQL = "SELECT 联系人姓名,公司名称 FROM 客户 WHERE 客户 ID=
'FAMIA' "
Set rsCustomers = Server.CreateObject("ADODB.Recordset")
rsCustomers.Open strSQL,strDSN
Set objFirstName = rsCustomers("联系人姓名 ")
Set objLastName = rsCustomers("公司名称 ")
Do Until rsCustomers.EOF
Response.Write objFirstName & "-------- " & objLastName & "<BR>"
rsCustomers.MoveNext
Loop
%>
9-27b.asp的代码如下:
与 9-27a.asp的区别是未建立
Connection对象,但结果相同
9-27a.asp和 9-27a.asp的运行结果如图:
例 9,30( test9-30.html和 9-30.asp)
test9-30.html用来产生向用户收集信息的 表单,9-30.asp
用来响应用户的请求。
ASP访问数据库实例
<html>
<body>
<form method=post action=9-30.asp>
<p>查看客户信息请点击这里
<input type=submit name=button value="客户信息 ">
</p>
<p>查看产品信息请点击这里
<input type=submit name=button value="产品信息 ">
</p>
</form>
</body>
</html>
test9-30.html的内容如下:
!注意 action属性
<%
const adOpenStatic=3
const adLockReadOnly=1
'建立 Recordset对象
Set rs=Server.CreateObject("ADODB.Recordset")
button=Request.Form("button")
CursorType=adOpenStatic
LockType=adLockReadOnly
9-30.asp的内容如下:
提取表单域,button” 值设定光标类型为静态设定锁定类型为只读
If button="客户信息 " Then
source="select * from 客户 "
activeConnection="dsn=pubs"
rs.open source,activeConnection,CursorType,LockType
end if
If button="产品信息 " Then
source="select * from 产品 "
ActiveConnection="dsn=pubs"
rs.Open source,ActiveConnection,CursorType,LockType
End if
如果用户选择,客户信息,
则执行下面的代码如果用户选择,产品信息,
则执行下面的代码
Response.Write "<table border=3>"
Response.Write "<tr>"
For i=0 to rs.Fields.Count-1
Response.Write "<td>"&Ucase(rs(i).Name)&"</td>"
Next
Response.Write "</tr>"
While NOT rs.EOF
Response.Write "<tr>"
For i=0 to rs.Fields.Count-1
Response.Write "<td>"&rs(i).Value&"</td>"
Next
rs.MoveNext
Wend
Response.Write "</table>"
Set rs=nothing
%>
查询结果以表格的形式输出输出表格内容运行结果 如图:
例 9,31 Recordset访问数据库( 9-31.asp)
数据库为 ntopsamp.mdb。
ASP访问数据库实例
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & _
";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MSAccess;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT Avg(价格 ) As 平均 From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Avg," & rs2("平均 ")
rs2.Close
SqlStr = "SELECT Count(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Count(价格 )," & rs2(0)
rs2.Close
9-31.asp的代码如下:
同一个记录集 rs2多次使用
SqlStr = "SELECT Count(*) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Count(*)," & rs2(0)
rs2.Close
SqlStr = "SELECT Sum(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Sum," & rs2(0)
rs2.Close
SqlStr = "SELECT Min(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Min," & rs2(0)
rs2.Close
SqlStr = "SELECT Max(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Max," & rs2(0)
rs2.Close
注意:同一个记录集 rs2多次使用
SqlStr = "SELECT First(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>First(价格 )," & rs2(0)
rs2.Close
SqlStr = "SELECT Last(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Last(价格 )," & rs2(0)
rs2.Close
SqlStr = "SELECT First(代号 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>First(代号 )," & rs2(0)
rs2.Close
SqlStr = "SELECT Last(代号 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Last(代号 )," & rs2(0)
rs2.Close
SqlStr = "SELECT StDev(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>StDev," & rs2(0)
rs2.Close
SqlStr = "SELECT Var(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Var," & rs2(0)
rs2.Close
conn1.Close
%>
运行结果如图:
用户登录验证例 9,32 用户登录验证 ( 9-32.asp和 login.asp)
数据库,info.mdb
其中表,userinfo
userinfo包含字段,userid,psw,logins,pswnotice、
pswanswer,email,qq,name,age,education、
occupation,city,address,postnum
ASP访问数据库实例
<html>
<body>
<form name="form1" method="post" action="9-32.asp">
<p>用户名
<input name="userid" type="text" id="userid">
</p>
<p> 口令
<input name="psw" type="password" id="psw">
</p>
<p>
<input type="submit" name="Submit" value="提交 ">
<input type="reset" name="Submit2" value="重置 ">
</p>
</form>
</body>
</html>
login.asp的内容如下:
注意 action属性
<html>
<body>
<%
username=trim(request.Form("userid"))
password=trim(request.Form("psw"))
dim conn
Set conn = Server.CreateObject("ADODB.Connection")
set TmpRs=server.createobject("adodb.recordset")
conn.Open "DBQ=" & Server.MapPath("info.mdb") & _
";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FILe=MS
Access;"
Set TmpRs = Server.CreateObject("ADODB.Recordset")
TmpRs.open "select * from userinfo Whereuserid='"&username&"';",conn,3,3
%>
9-32.asp的内容如下:
<% if tmprs.EOF then %>
<script language="vbscript">
MsgBox "该用户不存在,请先注册 !!!!"
location.href="javascript:history.back()"
</script>
<%else if password<>tmprs("psw") then %>
<script language="vbscript">
MsgBox "口令错误,请重新输入密码 !!!!!"
location.href="javascript:history.back()"
</script>
<% else
session("username")=username
tmprs("logins")=tmprs("logins")+1
tmprs.update
response.Write tmprs("logins")
tmprs.close
set tmprs=nothing
conn.close
set conn=nothing
end if
end if
%>
</body>
</html>
该用户登陆次数加 1
添加及修改数据库例 9.33 添加及修改数据库记录( 9-33.asp和
publish_tiezi.asp)
数据库,info.mdb
其中表 composition,bbs,字段如下:
composition(topic,text,userid,length,time,owner)
bbs(owner,total,numnew,numtopic)
ASP访问数据库实例
<html>
<body>
<form name="form1" method="post" action="9-33.asp">
<p>topic
<input name="topic" type="text" id="topic"> </p>
<p>text
<textarea name="text" id="text"></textarea> </p>
<p>owner
<input name="owner" type="text" id="owner"> </p>
<p>
<input type="submit" name="Submit" value="提交 ">
<input type="reset" name="Submit2" value="重置 "> </p>
</form>
</body>
</html>
publish_tiezi.asp的内容:
注意 Action属性
<% if request("topic")="" then %>
<script language="vbscript">
MsgBox "主题不能为空 !!!!! "
location.href="javascript:history.back()"
</script>
<%elseif request("text")="" then %>
<script language="vbscript">
MsgBox "论坛不允许灌水行为 !!!!! "
location.href="javascript:history.back()"
</script>
<% else
owner=request("owner")
set cn=server.CreateObject("ADODB.connection")
DBPath=server.MapPath("info.mdb")
cn.open "driver={Microsoft Access Driver (*.mdb)};dbq="& DBPath
set com_rs=server.CreateObject("ADODB.recordset")
set bbs_rs=server.CreateObject("ADODB.recordset")
com_rs.open "Select * from composition;",cn,2,3
com_rs.AddNew
com_rs("topic")=request("topic")
com_rs("text")=request("text")
com_rs("userid")=session.contents("username")
com_rs("length")=len(trim(request("text")))
com_rs("time")=now()
com_rs("owner")=request("owner")
com_rs.update
com_rs.close
表 composition中添加新记录确定所做的修改
bbs_rs.open "Select * from bbs where owner='"&owner&"'",cn,3,3
if not bbs_rs then
bbs_rs("total")=bbs_rs("total")+1
bbs_rs("numnew")=bbs_rs("numnew")+1
bbs_rs("numtopic")=bbs_rs("numtopic")+1
bbs_rs.update
endif
response.Write,帖子已发表成功 "
bbs_rs.close
end if
%>
表 bbs中修改记录内容
数据库显示 ——不分页例:不分页显示数据库内容
display_db_dsn.asp和
display_db_lessdsn.asp
( 运行结果完全一样)
ASP访问数据库实例
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
Conn.Open "bbs"
RS.open sql,Conn,3,2
%>
display_db_dsn.asp的代码如下:
用 DSN数据源
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>无标题文档 </title>
</head>
<body>
<table width="75%" border="1">
<tr>
<td><div align="center"> 主题 </div></td>
<td><div align="center">留言者 </div></td>
<td><div align="center">时间 </div></td>
</tr>
<% i=1
while not rs.eof
%>
<tr>
<td><%= rs("subject") %> </td>
<td><%= rs("name") %> </td>
<td><%= rs("postdate") %> </td>
</tr>
<% rs.movenext
i=i+1
wend
%>
</table>
<p> </p></body>
</html>
Recordset中字段 subject内容
Recordset记录指针下移
display_db_lessdsn.asp的代码如下:
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
Conn.Open="DRIVER={Microsoft Access Driver
(*.mdb)};DBQ="+server.MapPath("/bbs.mdb")
RS.open sql,Conn,3,2
%>
用非 DSN数据源
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档 </title>
</head>
<body>
<table width="75%" border="1">
<tr>
<td><div align="center"> 主题 </div></td>
<td><div align="center">留言者 </div></td>
<td><div align="center">时间 </div></td>
</tr>
<% i=1
while not rs.eof
%>
<tr>
<td><%= rs("subject") %> </td>
<td><%= rs("name") %> </td>
<td><%= rs("postdate") %> </td>
</tr>
<% rs.movenext
i=i+1
wend
%>
</table>
<p> </p></body>
</html>
ASP实现分页显示方法有很多,但主要有两种:
将数据库中所有符合查询条件的记录 一次性读入
recordset 中,存放在内存中,然后通过 ADO
Recordset 对象所提供的几个专门支持分页处理的属性,PageSize( 页大小 ),PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。
根据客户的指示,每次 分别 从符合查询条件的记录中将规定数目的记录数读取出来并显示。
两者的主要差别:
ASP实现分页显示
当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后在进行分页等处理,如果同时有超过 100 个的客户在线查询,那么
ASP 应用程序的执行效率将大受影响。
当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为 第一种方法的 ASP 程序编写相对第二种方法要简单明了 得多。
首先必须了解 Reordset 对象的属性和方法,
ASP实现分页显示
BOF 属性:目前指标指到 RecordSet 的第一笔。
EOF 属性:目前指标指到 RecordSet 的最后一笔。
Move 方法:移动指标到 RecordSet 中的某一条记录。
AbsolutePage 属性,设定当前记录的位置是位于哪一页
AbsolutePosition 属性,目前指标在 RecordSet 中的位置。
PageCount 属性,显示 Recordset 对象包括多少,页,的数据。
PageSize 属性,显示 Recordset 对象每一页显示的记录数。
RecordCount 属性:显示 Recordset 对象记录的总数。
一,BOF 与 EOF 属性使用 BOF 与 EOF 属性,可以得知一个 Recordset 对象是否包含有记录或者得知移动记录行是否已经超出该 Recordset
对象的范围。
例如,< % if not rs.eof then,.,%>
< % if not (rs.bof and rs.eof) %>
若当前记录的位置是在一个 Recordset 对象第一行记录之前时,BOF 属性 返回 true,反之则返回 false。
若当前记录的位置是在一个 Recordset 对象最后一行记录之后时,EOF 属性 返回 true,反之则返回 false。
BOF 与 EOF 都为 False,表示指标位于 RecordSet 的当中。
BOF 与 EOF 都为 True,在 RecordSet 里没有任何记录。
二,Move 方法
Move 方法移动指针到 RecordSet 中的某一条记录,语法如下:
rs.Move NumRecords,Start
说明:
,rs”,表示一个想要移动当前记录位置的 Recordset 对象;
,NumRecords”是一个正负数运算式,设定当前记录位置的移动数目。如果 NumRecords大于零,当前记录位置向末尾的方向移动;如果小于零,则当前记录位置向开头的方向移动;
,start”是一个可选的项目,用来指定记录起始的标签。
MoveFirst 方法:将当前记录位置移至第一笔记录。
MoveLast 方法:将当前记录位置移至最后一笔记录。
MoveNext 方法:将当前记录位置移至下一笔记录。
MovePrevious 方法:将当前记录位置移至上一笔记录。
Move [n] 方法:移动指标到第 n 笔记录,n 由 0 算起。
三,AbsolutePage 属性
AbsolutePage 属性设定当前记录的位置是位于 哪一页的页数编号 ;
与 AbsolutePosition 属性相同,AbsolutePage 属性是以 1 为起始的,若当前记录为 Recordset 的第一行记录,
AbsolutePage 为 1。可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置。
使用 PageSize 属性将 Recordset 对象分割为 逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于
PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。
四,AbsolutePosition 属性用 AbsolutePosition 属性确定 当前指针在 RecordSet
中的位置,AbsolutePosition 属性的数值为当前指针相对於第一条的位置,由 1 算起,即第一条的
AbsolutePosition 为 1。
若要启用 AbsolutePosition,必须先设定为使用用户端 cursor( 指针 ),asp 码如下:
rs2.CursorLocation = 3
五,PageCount 属性使用 PageCount 属性,决定 Recordset 对象包括多少,页,
的数据。这里的,页,是数据记录的集合,大小等于
PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一页也算是 PageCount 的一页。
注意:并不是所有的数据提供都支持此项属性。
六,PageSize 属性
PageSize 属性是决定 ADO 存取数据库时如何 分页显示的关键,使用它就可以决定多少记录组成一个 逻辑上的,一页,。设定并建立一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。
七,RecordCount 属性也是一个非常常用和重要的属性,常用
RecordCount 属性来找出一个 Recordset 对象包括多少条记录。
如,< % totle=RS.RecordCount %>
首先,为 PageSize 属性 设置一个值,从而指定从记录组中取出的构成一个页的行数;
如何运用它们来达到分页显示?
然后通过 RecordCount 属性 来确定记录的总数;
再用记录总数除以 PageSize 就可得到所显示的页面总数 ;
最后通过 AbsolutePage 属性 就能完成对指定页的访问。
BBS分页显示程序例 9,34 一个简单的 BBS应用程序( bbs.asp)
数据库 bbs.mdb中的表,meggase”分别有以下五个字段:
,” ID”,每个帖子的自动编号;
,” subject”,每个帖子的主题;
,” name”,加帖用户的姓名;
,” email”,用户的电子邮件地址;
,” postdate”,加帖的时间。
数据库的 DSN 为,bbs”。
<html>
<head>
<title>bbs</title>
<body>
<% 'Sub ShowList() %>
<%
PgSz=3
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
Conn.Open "bbs"
RS.open sql,Conn,1,1
If RS.RecordCount=0 then
response.write "<P><center>对不起,数据库中没有相关信息!</center></P>"
设定开关,指定每一页显示的帖子数目,默认为 3
查询所有帖子,并按帖子的 ID倒序排列
else
RS.PageSize = Cint(PgSz)
Total=INT(RS.recordcount / PgSz * -1)*-1
PageNo=Request("pageno")
if PageNo="" Then
PageNo = 1
else
PageNo=PageNo+1
PageNo=PageNo-1
end if
ScrollAction = Request("ScrollAction")
if ScrollAction = "上一页 " Then
PageNo=PageNo-1
end if
if ScrollAction = "下一页 " Then
PageNo=PageNo+1
end if
设定 PageSize属性的值计算可显示的页面的总数从本程序的 Form获取
ScrollAction的值
if PageNo < 1 Then
PageNo = 1
end if
n=1
RS.AbsolutePage = PageNo
Response.Write "<CENTER>"
position=RS.PageSize*PageNo
pagebegin=position-RS.PageSize+1
if position < RS.RecordCount then
pagend=position
else
pagend= RS.RecordCount
end if
Response.Write "<P><font color='Navy'><B>数据库查询结果,</B>"
Response.Write "(共有,& RS.RecordCount & "条符合条件的信息,显示 " & pagebegin&"-" & pagend&")</font></p>"
Response.Write "<TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF>"
Response.Write "<TR BGCOLOR=#5FB5E2><FONT SIZE=2><TD><B>主题
</B></TD><TD><B>用户 </B></TD><TD><B>Email</B></TD><TD><B>发布日期 </B></TD></FONT><TR BGCOLOR=#FFFFFF>"
RowCount = RS.PageSize
Do While Not RS.EOF and rowcount > 0
If n=1 then
Response.Write "<TR BGCOLOR=#FFFFFF>"
ELSE
Response.Write "<TR BGCOLOR=#EEEEEE>"
End If
n=1-n %>
记录集不空且未到底部,就循环
<TD><span style="font-size:9pt"><A href='view.asp?key=<%
=RS("ID")%>'><% =RS("subject")%></A></span></td>
<TD><span style="font-size:9pt"><% =RS("name")%></A></span></td>
<TD><span style="font-size:9pt"><a href="mailto:<%
=RS("email")%>"><% =RS("email")%>
</a></span> </TD>
<TD><span style="font-size:9pt"><% =RS("postdate")%>
</span> </td>
</TR> 输出记录集 rs中相应字段的值
<%
RowCount = RowCount - 1
RS.MoveNext
Loop
Conn.Close
set rs = nothing
set Conn = nothing
%>
取记录集 RS下一条循环
</TABLE>
<FORM METHOD=GET ACTION="bbs.asp">
<INPUT TYPE="HIDDEN" NAME="pageno" VALUE="<% =PageNo %>">
<%
if PageNo > 1 Then
response.write "<INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE='上一页 '>"
end if
if RowCount = 0 and PageNo <>Total then
response.write "<INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE='下一页 '>"
end if
response.write "</FORM>"
End if %>
<% 'End Sub %>
</body>
</html>
运行结果如图:
ASP访问数据库
DSN(Data Source Name 数据源名称 ),建立一个系统数据源名称方法如下,
1、单击,开始,,选设置控制面板。
2、双击图标,32 位 ODBC”,将弹出一个对话框,选标签
,System DSN”
3,单击,Add”添加一个 DSN 入口,选择如,Microsoft
Access Driver”并确认。
4、在,Data Source Name”栏里输入你希望指定的 DSN,然后单击,Select”选择数据库存放位置,你可以按,Browse”来选取。
5、以上步骤完成后在 ASP 程序中指定 DSN,如下,
< %connstr = "FILEDSN=MyDatabase.dsn"%>
注意:无论在等号 (=)之前还是之后,DSN字符串都不能包含空格。
DSN-less,是另一种通过在 ASP 文件里直接指定数据库文件所在位置,而无需建立 DSN 的方法。由于许多公司没有自己的 WEB 服务器,他们的网站往往是存放在远端的虚拟服务器上,因此要建立和修改 DSN
的设置比较麻烦。而使用 DSN-less 方法直接指定远端数据库所在位置恰恰解决了这一问题,方法如下,
< %
connstr =
"DBQ="+server.mappath("database/source.mdb")+";DefaultDir
=;DRIVER={Microsoft Access Driver
(*.mdb)};DriverId=25;FIL=MS
Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanR
ows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCom
mitSync=Yes;"
%>
<%
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
server.mappath("data/database.mdb")
'如果你的服务器采用较老版本 Access驱动,请用下面连接方法
'connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" &
server.mappath("data/database.mdb")
%>
指定了想要连接的数据库后,就可以通过以下方法连接并打开数据库,
< %
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open connstr
%>
第二步,指定想要执行的 SQL 指令,可以使用 RecordSet。
当连接了数据库后就可以对数据库进行操作,比如增加、
删除、查询,更新等等,这些操作都是通过 SQL 指令来完成的,如下例在数据库表 database 中查询所有姓名中有
,A”的记录,
< %
Set rs = Server.CreateObject("ADODB.Recordset")
sql="select * from database where name like '%A%'"
rs = Conn.Execute(sql)
Conn.close
%>
<%
strSQL = "INSERT INTO Customers (FirstName,
LastName) VALUES ('Jose','Lugo')"
Conn.Execute(strSQL)
%>
<%
Conn.Execute "UPDATE Customers SET FirstName =
'Jeff? WHERE LastName = 'Smith' "
%>
<%
Conn.Execute "DELETE FROM Customers WHERE
LastName = 'Smith'"
%>
尽管 Connection 对象简化了连接数据库和查询任务,但 Connection 对象仍有许多不足 。确切地说,检索和显示数据库信息的 Connection 对象不能用于创建脚本,编程者必须确切知道要对数据库作出的更改,然后才能使用查询实现更改。
对于检索数据、检查结果、更改数据库,ADO
提供了 Recordset 对象 。
Recordset 对象检索并且显示一组数据库行,即记录,Recordset
对象保持查询返回的记录的位置,允许一次一项逐步扫描结果。
根据 Recordset 对象的指针类型属性设置,可以滚动和更新记录。
数据库指针可以在一组记录中定位到特定的项,还用于检索和检查记录,然后在这些记录的基础上执行操作。
Recordset 对象有一些属性,可用于精确地控制指针的行为,提高检查和更新结果的能力。
例如,Recordset 的使用方法如下
Recordset 对象
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL 指令,Conn,1,1 ' 读取或
rs.Open SQL 指令,Conn,1,3 ' 新增、修改、或删除
Recordset对象 Open方法 的格式:
recordset.Open Source,ActiveConnection,
CursorType,LockType,Options
ActiveConnection,Recordset对象可以通过 ActiveConnection属性来连接 Connection对象 。
ActiveConnection可以是一个 Connection对象 或是一串包含数据库连接信息 ( ConnectionString) 的字符串参数。
Open后面的参数均为可选项参数说明
Source,Recordset对象可以通过 Source属性来连接 Command
对象 。 Source参数可以是一个 Command对象名称,一段 SQL命令,
一个指定的 数据表名称 或是一个 Stored Procedure。 假如省略这个参数,系统则采用 Recordset对象的 Source属性 。
打开一个静态类型 rdoResultset 对象。adOpenStatic
打开一个键集类型 rdoResultset 对象。
adOpenDynamic 打开一个动态类型 rdoResultset 对象。
adOpenKeyset
打开一个仅向前类型 rdoResultset对象。
即只可以从头到尾搜索行 (缺省值 )
adOpen
ForwardOnly
说 明常 量
CursorType,确定提供者打开 Recordset 时应该使用的游标类型 。 可为下列常量之一健相当于书签,只可根据健集的健值,添加、改变或删除基础数据库表或表的行。 获取更新行的查询结果。
不支持健,是行的动态集合,
动态添加改变或删除基础数据库表或表的行。 获取更新行的查询结果。
打开客户端 Recordset 对象时唯一允许使用的游标类型,这个游标使用的结果集合中的成员关系,顺序和值通常是固定的 。 相当于 结果集 的副本观察不到动态变化
LockType,参数指定锁定类型以支持并发,参数 可为下列常量之一开放式批更新 — 用于批更新模式(与立即更新模式相对)。
adLockBatch
Optimistic
开放式锁定(逐个) — 只在调用 Update 方法时才锁定记录。
adLock
Optimistic
保守式锁定(逐个) — 为确保成功编辑记录,
在编辑时立即锁定数据源的记录。
adLock
Pessimistic
只读 — 不能改变数据。(默认值)adLock
ReadOnly
说 明常 量
Options,指示提供者如何计算 Source 参数,
或从以前保存 Recordset 的文件中恢复
Recordset。可为下列常量之一指示提供者应该将 Source 视为存储的过程。
adCmdStoredProc
指示提供者应从 CommandText 命名的表中返回所有行。
adCmdTableDirect
指示 ADO 生成 SQL 查询以便从 Source
命名的表返回所有行。
adCmdTable
指示提供者应该将 Source 作为命令的文本定义来计算。
adCmdText
说 明常 量指示在提取 CacheSize 属性中指定的初始数量后,应该异步提取所有剩余的行。
adFetchAsync
指示应异步执行 Source。adExecuteAsync
指示应从 Source 命名的文件中恢复持久保存的 Recordset。
(默认值)
adCommandFile
指示 Source 参数中的命令类型为未知。
adCmdUnknown
说 明常 量第三步,使用 RecordSet 属性和方法,并显示执行的结果。
通过以上指令,创建了一个包含数据的游标 RecordSet)“rs”,
事实上游标是存储在活动内存中的 类似记录和字段的数组 的东西,
当通过 RecordSet 组件创建一个游标时,它从数据提供者得到一个数据集,并用它来充实游标。
ADO 产生的 RecordSet 是一个象 电子表格 的记录,它有一行行的记录,在任何时候都有一行是它的当前行,而 RecordSet
的字段是用 RecordSet 的 Field 集合表示的。
下面列出了 RecordSet 对象 的一些属性和方法,
rs.Fields.Count,RecordSet 对象的字段总数。
rs(i).Name,第 i 个字段的名称,i 由 0 算起到
rs.Fields.Count-1。
rs(i),读取第 i 个字段的数据,i 由 0 算起到 rs.Fields.Count-1。
rs(" 字段名称 "),读取指定字段的数据。
rs.RecordCount,游标中的数据记录总数。
rs.EOF,是否已指到最后一条记录。
rs.MoveNext,将指标移到下一笔记录。
rs.MovePrev,将指标移到上一笔记录。
rs.MoveFirst,将指标移到第一笔记录。
rs.MoveLast,将指标移到最后一笔记录。
rs.Close,关闭 RecordSet 对象
例 26 与数据库建立连接( 9-26.asp)
9-26.asp的代码如下:
ASP访问数据库实例
<% @ LANGUAGE=VBScript %>
<%
Option Explicit
Dim Cnn,StrCnn
Set Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" &Server.MapPath("bbs.mdb;")
Cnn.Open StrCnn
Response.Write Server.MapPath("bbs.mdb") & "<br>"
Response.Write "数据库连接成功," & Cnn.State & "<br>"
Cnn.close
Response.Write "数据库已经关闭," & Cnn.State
Set Cnn = Nothing
%>
创建 Connection 对象使用 Connection 对象的 Open 方法打开数据库 bbs.mdb,该数据库用户自己建立使用 Connection 对象的Close 方法关闭连接将 Connection 对象从内存中删除,以释放资源
9-26.asp的 运行结果如图
例 9.27 循环检索记录( 9-27a.asp和 9-27b.asp)
注意,先注册文件数据源为 Myaa.dsn,使用的数据库为
northwind.mdb。
ASP访问数据库实例
<%
strDSN = "FILEDSN=Myaa.dsn"
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open strDSN
Set rsCustomers = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT 联系人姓名,公司名称 FROM 客户 WHERE 客户 ID=
'FAMIA' "
rsCustomers.Open strSQL,cn
Set objFirstName = rsCustomers("联系人姓名 ")
Set objLastName = rsCustomers("公司名称 ")
Do Until rsCustomers.EOF
Response.Write objFirstName & "-------- " & objLastName & "<BR>"
rsCustomers.MoveNext
Loop
%>
9-27a.asp的代码如下:
初始化 Recordset对象循环查询,并显示结果
<%
strDSN = "FILEDSN=Myaa.dsn"
strSQL = "SELECT 联系人姓名,公司名称 FROM 客户 WHERE 客户 ID=
'FAMIA' "
Set rsCustomers = Server.CreateObject("ADODB.Recordset")
rsCustomers.Open strSQL,strDSN
Set objFirstName = rsCustomers("联系人姓名 ")
Set objLastName = rsCustomers("公司名称 ")
Do Until rsCustomers.EOF
Response.Write objFirstName & "-------- " & objLastName & "<BR>"
rsCustomers.MoveNext
Loop
%>
9-27b.asp的代码如下:
与 9-27a.asp的区别是未建立
Connection对象,但结果相同
9-27a.asp和 9-27a.asp的运行结果如图:
例 9,30( test9-30.html和 9-30.asp)
test9-30.html用来产生向用户收集信息的 表单,9-30.asp
用来响应用户的请求。
ASP访问数据库实例
<html>
<body>
<form method=post action=9-30.asp>
<p>查看客户信息请点击这里
<input type=submit name=button value="客户信息 ">
</p>
<p>查看产品信息请点击这里
<input type=submit name=button value="产品信息 ">
</p>
</form>
</body>
</html>
test9-30.html的内容如下:
!注意 action属性
<%
const adOpenStatic=3
const adLockReadOnly=1
'建立 Recordset对象
Set rs=Server.CreateObject("ADODB.Recordset")
button=Request.Form("button")
CursorType=adOpenStatic
LockType=adLockReadOnly
9-30.asp的内容如下:
提取表单域,button” 值设定光标类型为静态设定锁定类型为只读
If button="客户信息 " Then
source="select * from 客户 "
activeConnection="dsn=pubs"
rs.open source,activeConnection,CursorType,LockType
end if
If button="产品信息 " Then
source="select * from 产品 "
ActiveConnection="dsn=pubs"
rs.Open source,ActiveConnection,CursorType,LockType
End if
如果用户选择,客户信息,
则执行下面的代码如果用户选择,产品信息,
则执行下面的代码
Response.Write "<table border=3>"
Response.Write "<tr>"
For i=0 to rs.Fields.Count-1
Response.Write "<td>"&Ucase(rs(i).Name)&"</td>"
Next
Response.Write "</tr>"
While NOT rs.EOF
Response.Write "<tr>"
For i=0 to rs.Fields.Count-1
Response.Write "<td>"&rs(i).Value&"</td>"
Next
rs.MoveNext
Wend
Response.Write "</table>"
Set rs=nothing
%>
查询结果以表格的形式输出输出表格内容运行结果 如图:
例 9,31 Recordset访问数据库( 9-31.asp)
数据库为 ntopsamp.mdb。
ASP访问数据库实例
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & _
";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MSAccess;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT Avg(价格 ) As 平均 From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Avg," & rs2("平均 ")
rs2.Close
SqlStr = "SELECT Count(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Count(价格 )," & rs2(0)
rs2.Close
9-31.asp的代码如下:
同一个记录集 rs2多次使用
SqlStr = "SELECT Count(*) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Count(*)," & rs2(0)
rs2.Close
SqlStr = "SELECT Sum(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Sum," & rs2(0)
rs2.Close
SqlStr = "SELECT Min(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Min," & rs2(0)
rs2.Close
SqlStr = "SELECT Max(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Max," & rs2(0)
rs2.Close
注意:同一个记录集 rs2多次使用
SqlStr = "SELECT First(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>First(价格 )," & rs2(0)
rs2.Close
SqlStr = "SELECT Last(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Last(价格 )," & rs2(0)
rs2.Close
SqlStr = "SELECT First(代号 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>First(代号 )," & rs2(0)
rs2.Close
SqlStr = "SELECT Last(代号 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Last(代号 )," & rs2(0)
rs2.Close
SqlStr = "SELECT StDev(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>StDev," & rs2(0)
rs2.Close
SqlStr = "SELECT Var(价格 ) From 产品 "
rs2.Open SqlStr,conn1,1,1
Response.Write "<BR>Var," & rs2(0)
rs2.Close
conn1.Close
%>
运行结果如图:
用户登录验证例 9,32 用户登录验证 ( 9-32.asp和 login.asp)
数据库,info.mdb
其中表,userinfo
userinfo包含字段,userid,psw,logins,pswnotice、
pswanswer,email,qq,name,age,education、
occupation,city,address,postnum
ASP访问数据库实例
<html>
<body>
<form name="form1" method="post" action="9-32.asp">
<p>用户名
<input name="userid" type="text" id="userid">
</p>
<p> 口令
<input name="psw" type="password" id="psw">
</p>
<p>
<input type="submit" name="Submit" value="提交 ">
<input type="reset" name="Submit2" value="重置 ">
</p>
</form>
</body>
</html>
login.asp的内容如下:
注意 action属性
<html>
<body>
<%
username=trim(request.Form("userid"))
password=trim(request.Form("psw"))
dim conn
Set conn = Server.CreateObject("ADODB.Connection")
set TmpRs=server.createobject("adodb.recordset")
conn.Open "DBQ=" & Server.MapPath("info.mdb") & _
";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FILe=MS
Access;"
Set TmpRs = Server.CreateObject("ADODB.Recordset")
TmpRs.open "select * from userinfo Whereuserid='"&username&"';",conn,3,3
%>
9-32.asp的内容如下:
<% if tmprs.EOF then %>
<script language="vbscript">
MsgBox "该用户不存在,请先注册 !!!!"
location.href="javascript:history.back()"
</script>
<%else if password<>tmprs("psw") then %>
<script language="vbscript">
MsgBox "口令错误,请重新输入密码 !!!!!"
location.href="javascript:history.back()"
</script>
<% else
session("username")=username
tmprs("logins")=tmprs("logins")+1
tmprs.update
response.Write tmprs("logins")
tmprs.close
set tmprs=nothing
conn.close
set conn=nothing
end if
end if
%>
</body>
</html>
该用户登陆次数加 1
添加及修改数据库例 9.33 添加及修改数据库记录( 9-33.asp和
publish_tiezi.asp)
数据库,info.mdb
其中表 composition,bbs,字段如下:
composition(topic,text,userid,length,time,owner)
bbs(owner,total,numnew,numtopic)
ASP访问数据库实例
<html>
<body>
<form name="form1" method="post" action="9-33.asp">
<p>topic
<input name="topic" type="text" id="topic"> </p>
<p>text
<textarea name="text" id="text"></textarea> </p>
<p>owner
<input name="owner" type="text" id="owner"> </p>
<p>
<input type="submit" name="Submit" value="提交 ">
<input type="reset" name="Submit2" value="重置 "> </p>
</form>
</body>
</html>
publish_tiezi.asp的内容:
注意 Action属性
<% if request("topic")="" then %>
<script language="vbscript">
MsgBox "主题不能为空 !!!!! "
location.href="javascript:history.back()"
</script>
<%elseif request("text")="" then %>
<script language="vbscript">
MsgBox "论坛不允许灌水行为 !!!!! "
location.href="javascript:history.back()"
</script>
<% else
owner=request("owner")
set cn=server.CreateObject("ADODB.connection")
DBPath=server.MapPath("info.mdb")
cn.open "driver={Microsoft Access Driver (*.mdb)};dbq="& DBPath
set com_rs=server.CreateObject("ADODB.recordset")
set bbs_rs=server.CreateObject("ADODB.recordset")
com_rs.open "Select * from composition;",cn,2,3
com_rs.AddNew
com_rs("topic")=request("topic")
com_rs("text")=request("text")
com_rs("userid")=session.contents("username")
com_rs("length")=len(trim(request("text")))
com_rs("time")=now()
com_rs("owner")=request("owner")
com_rs.update
com_rs.close
表 composition中添加新记录确定所做的修改
bbs_rs.open "Select * from bbs where owner='"&owner&"'",cn,3,3
if not bbs_rs then
bbs_rs("total")=bbs_rs("total")+1
bbs_rs("numnew")=bbs_rs("numnew")+1
bbs_rs("numtopic")=bbs_rs("numtopic")+1
bbs_rs.update
endif
response.Write,帖子已发表成功 "
bbs_rs.close
end if
%>
表 bbs中修改记录内容
数据库显示 ——不分页例:不分页显示数据库内容
display_db_dsn.asp和
display_db_lessdsn.asp
( 运行结果完全一样)
ASP访问数据库实例
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
Conn.Open "bbs"
RS.open sql,Conn,3,2
%>
display_db_dsn.asp的代码如下:
用 DSN数据源
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>无标题文档 </title>
</head>
<body>
<table width="75%" border="1">
<tr>
<td><div align="center"> 主题 </div></td>
<td><div align="center">留言者 </div></td>
<td><div align="center">时间 </div></td>
</tr>
<% i=1
while not rs.eof
%>
<tr>
<td><%= rs("subject") %> </td>
<td><%= rs("name") %> </td>
<td><%= rs("postdate") %> </td>
</tr>
<% rs.movenext
i=i+1
wend
%>
</table>
<p> </p></body>
</html>
Recordset中字段 subject内容
Recordset记录指针下移
display_db_lessdsn.asp的代码如下:
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
Conn.Open="DRIVER={Microsoft Access Driver
(*.mdb)};DBQ="+server.MapPath("/bbs.mdb")
RS.open sql,Conn,3,2
%>
用非 DSN数据源
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档 </title>
</head>
<body>
<table width="75%" border="1">
<tr>
<td><div align="center"> 主题 </div></td>
<td><div align="center">留言者 </div></td>
<td><div align="center">时间 </div></td>
</tr>
<% i=1
while not rs.eof
%>
<tr>
<td><%= rs("subject") %> </td>
<td><%= rs("name") %> </td>
<td><%= rs("postdate") %> </td>
</tr>
<% rs.movenext
i=i+1
wend
%>
</table>
<p> </p></body>
</html>
ASP实现分页显示方法有很多,但主要有两种:
将数据库中所有符合查询条件的记录 一次性读入
recordset 中,存放在内存中,然后通过 ADO
Recordset 对象所提供的几个专门支持分页处理的属性,PageSize( 页大小 ),PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。
根据客户的指示,每次 分别 从符合查询条件的记录中将规定数目的记录数读取出来并显示。
两者的主要差别:
ASP实现分页显示
当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后在进行分页等处理,如果同时有超过 100 个的客户在线查询,那么
ASP 应用程序的执行效率将大受影响。
当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为 第一种方法的 ASP 程序编写相对第二种方法要简单明了 得多。
首先必须了解 Reordset 对象的属性和方法,
ASP实现分页显示
BOF 属性:目前指标指到 RecordSet 的第一笔。
EOF 属性:目前指标指到 RecordSet 的最后一笔。
Move 方法:移动指标到 RecordSet 中的某一条记录。
AbsolutePage 属性,设定当前记录的位置是位于哪一页
AbsolutePosition 属性,目前指标在 RecordSet 中的位置。
PageCount 属性,显示 Recordset 对象包括多少,页,的数据。
PageSize 属性,显示 Recordset 对象每一页显示的记录数。
RecordCount 属性:显示 Recordset 对象记录的总数。
一,BOF 与 EOF 属性使用 BOF 与 EOF 属性,可以得知一个 Recordset 对象是否包含有记录或者得知移动记录行是否已经超出该 Recordset
对象的范围。
例如,< % if not rs.eof then,.,%>
< % if not (rs.bof and rs.eof) %>
若当前记录的位置是在一个 Recordset 对象第一行记录之前时,BOF 属性 返回 true,反之则返回 false。
若当前记录的位置是在一个 Recordset 对象最后一行记录之后时,EOF 属性 返回 true,反之则返回 false。
BOF 与 EOF 都为 False,表示指标位于 RecordSet 的当中。
BOF 与 EOF 都为 True,在 RecordSet 里没有任何记录。
二,Move 方法
Move 方法移动指针到 RecordSet 中的某一条记录,语法如下:
rs.Move NumRecords,Start
说明:
,rs”,表示一个想要移动当前记录位置的 Recordset 对象;
,NumRecords”是一个正负数运算式,设定当前记录位置的移动数目。如果 NumRecords大于零,当前记录位置向末尾的方向移动;如果小于零,则当前记录位置向开头的方向移动;
,start”是一个可选的项目,用来指定记录起始的标签。
MoveFirst 方法:将当前记录位置移至第一笔记录。
MoveLast 方法:将当前记录位置移至最后一笔记录。
MoveNext 方法:将当前记录位置移至下一笔记录。
MovePrevious 方法:将当前记录位置移至上一笔记录。
Move [n] 方法:移动指标到第 n 笔记录,n 由 0 算起。
三,AbsolutePage 属性
AbsolutePage 属性设定当前记录的位置是位于 哪一页的页数编号 ;
与 AbsolutePosition 属性相同,AbsolutePage 属性是以 1 为起始的,若当前记录为 Recordset 的第一行记录,
AbsolutePage 为 1。可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置。
使用 PageSize 属性将 Recordset 对象分割为 逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于
PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。
四,AbsolutePosition 属性用 AbsolutePosition 属性确定 当前指针在 RecordSet
中的位置,AbsolutePosition 属性的数值为当前指针相对於第一条的位置,由 1 算起,即第一条的
AbsolutePosition 为 1。
若要启用 AbsolutePosition,必须先设定为使用用户端 cursor( 指针 ),asp 码如下:
rs2.CursorLocation = 3
五,PageCount 属性使用 PageCount 属性,决定 Recordset 对象包括多少,页,
的数据。这里的,页,是数据记录的集合,大小等于
PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一页也算是 PageCount 的一页。
注意:并不是所有的数据提供都支持此项属性。
六,PageSize 属性
PageSize 属性是决定 ADO 存取数据库时如何 分页显示的关键,使用它就可以决定多少记录组成一个 逻辑上的,一页,。设定并建立一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。
七,RecordCount 属性也是一个非常常用和重要的属性,常用
RecordCount 属性来找出一个 Recordset 对象包括多少条记录。
如,< % totle=RS.RecordCount %>
首先,为 PageSize 属性 设置一个值,从而指定从记录组中取出的构成一个页的行数;
如何运用它们来达到分页显示?
然后通过 RecordCount 属性 来确定记录的总数;
再用记录总数除以 PageSize 就可得到所显示的页面总数 ;
最后通过 AbsolutePage 属性 就能完成对指定页的访问。
BBS分页显示程序例 9,34 一个简单的 BBS应用程序( bbs.asp)
数据库 bbs.mdb中的表,meggase”分别有以下五个字段:
,” ID”,每个帖子的自动编号;
,” subject”,每个帖子的主题;
,” name”,加帖用户的姓名;
,” email”,用户的电子邮件地址;
,” postdate”,加帖的时间。
数据库的 DSN 为,bbs”。
<html>
<head>
<title>bbs</title>
<body>
<% 'Sub ShowList() %>
<%
PgSz=3
Set Conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
sql = "SELECT * FROM message order by ID DESC"
Conn.Open "bbs"
RS.open sql,Conn,1,1
If RS.RecordCount=0 then
response.write "<P><center>对不起,数据库中没有相关信息!</center></P>"
设定开关,指定每一页显示的帖子数目,默认为 3
查询所有帖子,并按帖子的 ID倒序排列
else
RS.PageSize = Cint(PgSz)
Total=INT(RS.recordcount / PgSz * -1)*-1
PageNo=Request("pageno")
if PageNo="" Then
PageNo = 1
else
PageNo=PageNo+1
PageNo=PageNo-1
end if
ScrollAction = Request("ScrollAction")
if ScrollAction = "上一页 " Then
PageNo=PageNo-1
end if
if ScrollAction = "下一页 " Then
PageNo=PageNo+1
end if
设定 PageSize属性的值计算可显示的页面的总数从本程序的 Form获取
ScrollAction的值
if PageNo < 1 Then
PageNo = 1
end if
n=1
RS.AbsolutePage = PageNo
Response.Write "<CENTER>"
position=RS.PageSize*PageNo
pagebegin=position-RS.PageSize+1
if position < RS.RecordCount then
pagend=position
else
pagend= RS.RecordCount
end if
Response.Write "<P><font color='Navy'><B>数据库查询结果,</B>"
Response.Write "(共有,& RS.RecordCount & "条符合条件的信息,显示 " & pagebegin&"-" & pagend&")</font></p>"
Response.Write "<TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF>"
Response.Write "<TR BGCOLOR=#5FB5E2><FONT SIZE=2><TD><B>主题
</B></TD><TD><B>用户 </B></TD><TD><B>Email</B></TD><TD><B>发布日期 </B></TD></FONT><TR BGCOLOR=#FFFFFF>"
RowCount = RS.PageSize
Do While Not RS.EOF and rowcount > 0
If n=1 then
Response.Write "<TR BGCOLOR=#FFFFFF>"
ELSE
Response.Write "<TR BGCOLOR=#EEEEEE>"
End If
n=1-n %>
记录集不空且未到底部,就循环
<TD><span style="font-size:9pt"><A href='view.asp?key=<%
=RS("ID")%>'><% =RS("subject")%></A></span></td>
<TD><span style="font-size:9pt"><% =RS("name")%></A></span></td>
<TD><span style="font-size:9pt"><a href="mailto:<%
=RS("email")%>"><% =RS("email")%>
</a></span> </TD>
<TD><span style="font-size:9pt"><% =RS("postdate")%>
</span> </td>
</TR> 输出记录集 rs中相应字段的值
<%
RowCount = RowCount - 1
RS.MoveNext
Loop
Conn.Close
set rs = nothing
set Conn = nothing
%>
取记录集 RS下一条循环
</TABLE>
<FORM METHOD=GET ACTION="bbs.asp">
<INPUT TYPE="HIDDEN" NAME="pageno" VALUE="<% =PageNo %>">
<%
if PageNo > 1 Then
response.write "<INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE='上一页 '>"
end if
if RowCount = 0 and PageNo <>Total then
response.write "<INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE='下一页 '>"
end if
response.write "</FORM>"
End if %>
<% 'End Sub %>
</body>
</html>
运行结果如图: