ASP讲座之八:ASP与数据库(三)

2018-09-06 11:17

阅读:561

  在上两讲中,我们讲解了ASP中数据库的基本使用,今天将介绍几种非常实用的技术。

一、 分页技术
前面我们介绍了如何检索数据并输出到浏览器端,对少量数据而言,那样简单的输出处理是完全可以的,但是若数据量很大,有几百条甚至上千条,一次将如此多的数据全部输出到客户端是不现实的,一来页面从上到下拉得很长,二来客户端等待的时间过长,三来服务器的负载过大。所以采取分页输出非常必要。
要求:输出Northwind.mdb“产品”表中的数据至浏览器,每页显示10条。
例wuf60.asp,这段代码还是有点难度的,要多看多体会,AdoAccess.asp在上讲中提到过。
注:该例程吸收了某些书籍中好的部分,特此声明。
<%@ LANGUAGE=VBSCRIPT %>
<!--#include file=AdoAccess.asp-->
<%
Dim RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
absPageNum- 当前页为第几页
TotalPages- 总的页数
absRecordNum - 当前页中某一条记录的序号, 如 1-10

RecordPerPage = 10每页显示的记录数

取得所输出数据的 当前页码
If Request.ServerVariables(CONTENT_LENGTH) = 0 Then
若没收到表单递交的数据(如首次加载该页时), 则从第 1 页开始显示
absPageNum = 1
Else
取出按 按钮 时的页码
absPageNum = CInt(Request.Form(PressPageNum))
如按 上一页 则页码 -1, 按 下一页, 则页码 +1
If Request.Form(Submit) = 上一页 Then
absPageNum = absPageNum - 1
ElseIf Request.Form(Submit) = 下一页 Then
absPageNum = absPageNum + 1
End If
End If

创建记录集对象
Set rsTest = Server.CreateObject(ADODB.Recordset)

rsTest.CursorLocation = adUseClient这样设置可减轻数据库负载
rsTest.CursorType = adOpenStatic游标需要前后移动,不能设为仅向前
rsTest.CacheSize = RecordPerPage设置这个选项会提高性能

StrSQL = SELECT * FROM 产品 Order By 产品ID
rsTest.Open StrSQL, Cnn, , , adCmdText

rsTest.PageSize = RecordPerPage设置每一页的记录数

If Not(rsTest.EOF) Then
rsTest.AbsolutePage = absPageNum
End If

TotalPages = rsTest.PageCount
%>

<% 下面部分 输出当前页的数据至浏览器 %>
<Html><Boby>
<table colspan=8 cellpadding=5 border=0>
<tr>
<td align=CENTER bgcolor=#800000 width=109> <font style=ARIAL NARROW color=#ffffff size=2>单价</font></td>
<td align=CENTER width=459 bgcolor=#800000> <font style=ARIAL NARROW color=#ffffff size=2>产品名称</font></td>
</tr>
<% 用循环输出当前页的 10 条数据
For absRecordNum = 1 to rsTest.PageSize
%>
<tr>
<td bgcolor=f7efde align=CENTER> <font style=ARIAL NARROW size=2><%= rsTest(单价)%></font></td>
<td bgcolor=f7efde align=CENTER> <font style=ARIAL NARROW size=2><%= rsTest(产品名称)%></font></td>
</tr>
<%
rsTest.MoveNext
If rsTest.EOF Then
Exit For 如果已到记录尾, 退出 - 如最后一页数据不满页时
End If
Next

rsTest.Close : Cnn.Close
Set rsTest = Nothing : Set Cnn = Nothing
%>
</table>

<% 下面部分 是两个按钮 上一页 下一页 %>
<Form Action = <%= Request.ServerVariables(SCRIPT_NAME) %> Method=Post>
<Input Type=Hidden Name=PressPageNum Value=<%= absPageNum%>>
<%
If absPageNum > 1 Then如果当前不是第一页, 则显示上一页按钮 %>
<Input Type=Submit Name=Submit Value=上一页>
<% End If
If absPageNum <> TotalPages Then 如果当前页不是最后一页, 则显示下一页按钮%>
<Input Type=Submit Name=Submit Value=下一页>
<% End If %>
</Form>
<P><Center> [ 第 <font color=#CC0033><%= absPageNum %></font> 页,
共 <font color=#CC0033><%= TotalPages %></font> 页 ] </Center></P>
</BODY></HTML>
分析:
1.Recordset对象一些有用的属性:
l rsTest.CursorLocation = adUseClient:也可以不要这句,但这样做可以减轻数据库负载;
l rsTest.CacheSize = RecordPerPage:CacheSize属性用来决定每次用户端从数据库服务器取得的数据多少;
l rsTest.PageSize:PageSize属性用来设置每一页记录数的多少;
l rsTest.AbsolutePage:AbsolutePage属性设置当前数据在Recordset对象中的绝对页数;
l rsTest.PageCount:PageCount属性用来获取记录集的总页数。
2.本例Form表单中使用了一个隐含字段PressPageNum 用来传递点击按钮时为第几页。

二、 错误处理
代码执行的过程中,可能因各种原因发生错误,如:代码本身有问题、网络断开等等,所以在程序中设置错误捕获和处理是非常必要的。在ASP中,我们可以通过Connection对象的Errors数据集合取得代码运行时所发生的错误或警告信息,其使用方法如下:
1. 直接对Connection对象来使用:
Set Errs = Cnn.Errors
或者
Cnn.Errors
2. 建立Recordset对象或Command对象后,再通过其ActiveConnection属性来使用Connection对象:
Set Errs = rsTest.ActiveConnection.Errors
或者
rsTest.ActiveConnection.Errors
说起来太粗象,举一实例吧:wuf61.asp
<%@ LANGUAGE=VBSCRIPT %>
<% Option Explicit %>
<!--#include file=adovbs.inc-->
<%
Response.Expires = 0
下面这句保证: 即使脚本遇到错误, 也继续执行下一句
On Error Resume Next

Dim Cnn, rsTest, Errs, I
CommandTimeout - 与数据库连接的最长等待时间, 缺省为15秒
你可以分别在下面三种情况下检测错误发生情况 - 以SQL Server为例
1 - 完全正确; 2 - 未设置初始数据库; 3 - 数据库名误为 pvbs

Cnn.Open Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP
Cnn.Open Provider=sqloledb; User ID=sa; Password=; Initial Catalog=; Data Source=ICBCZJP
Cnn.Open Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pvbs; Data Source=ICBCZJP

For I = 0 To Cnn.Errors.Count - 1
Source属性表示造成错误的来源
Response.Write [ Cnn.Errors(I).Source ]
Description属性表示错误发生原因或描述
Response.Write Cnn.Errors(I).Description <br>
Next

If Cnn.Errors.Count > 0 Then
Response.Write 连接时发生 Cnn.Errors.Count 个错误 <br>
End If

Set rsTest = Server.CreateObject(ADODB.Recordset)
rsTest.Open jobs,Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable

IfrsTest.ActiveConnection.Errors.Count > 0 Then
Set Session(Errs) = rsTest.ActiveConnection.Errors
Response.Redirect ErrorHandle.asp
End If

Cnn.Close
Set rsTest = Nothing : Set Cnn = Nothing
%>
ErrorHandle.asp代码:
<%
Dim I
For I = 0 To Session(Errs).Count - 1
Response.Write [ Session(Errs)(I).Source ]
Response.Write Session(Errs)(I).Description <br>
Next
%>
分析:
在本例中,错误可能在连接时发生,也可能连接是正确的,但是在使用Reco


评论


亲,登录后才可以留言!