一 分页技术
前面我们介绍了如何检索数据并输出到浏览器端对少量数据而言那样简单的输出处理是完全可以的但是若数据量很大有几百条甚至上千条一次将如此多的数据全部输出到客户端是不现实的一来页面从上到下拉得很长二来客户端等待的时间过长三来服务器的负载过大所以采取分页输出非常必要
要求输出Northwindmdb产品表中的数据至浏览器每页显示条
例wufasp这段代码还是有点难度的要多看多体会AdoAccessasp在上讲中提到过
注该例程吸收了某些书籍中好的部分特此声明
<%@ LANGUAGE=VBSCRIPT %>
<!#include file=AdoAccessasp>
<!#include file=adovbsinc>
<%
Dim RecordPerPage absPageNum TotalPages absRecordNum rsTest StrSQL
absPageNum 当前页为第几页
TotalPages 总的页数
absRecordNum 当前页中某一条记录的序号 如
RecordPerPage = 每页显示的记录数
取得所输出数据的 当前页码
If RequestServerVariables(CONTENT_LENGTH) = Then
若没收到表单递交的数据(如首次加载该页时) 则从第 页开始显示
absPageNum =
Else
取出按 按钮 时的页码
absPageNum = CInt(RequestForm(PressPageNum))
如按 上一页 则页码 按 下一页 则页码 +
If RequestForm(Submit) = 上一页 Then
absPageNum = absPageNum
ElseIf RequestForm(Submit) = 下一页 Then
absPageNum = absPageNum +
End If
End If
创建记录集对象
Set rsTest = ServerCreateObject(ADODBRecordset)
rsTestCursorLocation = adUseClient 这样设置可减轻数据库负载
rsTestCursorType = adOpenStatic游标需要前后移动不能设为仅向前
rsTestCacheSize = RecordPerPage设置这个选项会提高性能
StrSQL = SELECT * FROM 产品 Order By 产品ID
rsTestOpen StrSQL Cnn adCmdText
rsTestPageSize = RecordPerPage 设置每一页的记录数
If Not(rsTestEOF) Then
rsTestAbsolutePage = absPageNum
End If
TotalPages = rsTestPageCount
%>
<% 下面部分 输出当前页的数据至浏览器 %>
<Html><Boby>
<table colspan= cellpadding= border=>
<tr>
<td align=CENTER bgcolor=# width=> <font color=#ffffff size=>单价</font></td>
<td align=CENTER width= bgcolor=#> <font color=#ffffff size=>产品名称</font></td>
</tr>
<% 用循环输出当前页的 条数据
For absRecordNum = to rsTestPageSize
%>
<tr>
<td bgcolor=fefde align=CENTER> <font size=><%= rsTest(单价)%></font></td>
<td bgcolor=fefde align=CENTER> <font size=><%= rsTest(产品名称)%></font></td>
</tr>
<%
rsTestMoveNext
If rsTestEOF Then
Exit For 如果已到记录尾 退出 如最后一页数据不满页时
End If
Next
rsTestClose : CnnClose
Set rsTest = Nothing : Set Cnn = Nothing
%>
</table>
<% 下面部分 是两个按钮 上一页 下一页 %>
<Form Action = <%= RequestServerVariables(SCRIPT_NAME) %> Method=Post>
<Input Type=Hidden Name=PressPageNum Value=<%= absPageNum%>>
<%
If absPageNum > 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=#CC><%= absPageNum %></font> 页
共 <font color=#CC><%= TotalPages %></font> 页 ] </Center></P>
</BODY></HTML>
分析
.Recordset对象一些有用的属性
l rsTestCursorLocation = adUseClient也可以不要这句但这样做可以减轻数据库负载
l rsTestCacheSize = RecordPerPageCacheSize属性用来决定每次用户端从数据库服务器取得的数据多少
l rsTestPageSizePageSize属性用来设置每一页记录数的多少
l rsTestAbsolutePageAbsolutePage属性设置当前数据在Recordset对象中的绝对页数
l rsTestPageCountPageCount属性用来获取记录集的总页数
.本例Form表单中使用了一个隐含字段PressPageNum 用来传递点击按钮时为第几页
二 错误处理
代码执行的过程中可能因各种原因发生错误如代码本身有问题网络断开等等所以在程序中设置错误捕获和处理是非常必要的在ASP中我们可以通过Connection对象的Errors数据集合取得代码运行时所发生的错误或警告信息其使用方法如下
. 直接对Connection对象来使用
Set Errs = CnnErrors
或者
CnnErrors
. 建立Recordset对象或Command对象后再通过其ActiveConnection属性来使用Connection对象
Set Errs = rsTestActiveConnectionErrors
或者
rsTestActiveConnectionErrors
说起来太粗象举一实例吧wufasp
<%@ LANGUAGE=VBSCRIPT %>
<% Option Explicit %>
<!#include file=adovbsinc>
<%
ResponseExpires =
下面这句保证: 即使脚本遇到错误 也继续执行下一句
On Error Resume Next
Dim Cnn rsTest Errs I
Set Cnn = ServerCreateObject(ADODBConnection)
CommandTimeout 与数据库连接的最长等待时间 缺省为秒
CnnCommandTimeout =
你可以分别在下面三种情况下检测错误发生情况 以SQL Server为例
完全正确; 未设置初始数据库; 数据库名误为 pvbs
CnnOpen Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP
CnnOpen Provider=sqloledb; User ID=sa; Password=; Initial Catalog=; Data Source=ICBCZJP
CnnOpen Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pvbs; Data Source=ICBCZJP
For I = To CnnErrorsCount
Source属性表示造成错误的来源
ResponseWrite [ & CnnErrors(I)Source & ]
Description属性表示错误发生原因或描述
ResponseWrite CnnErrors(I)Description & <br>
Next
If CnnErrorsCount > Then
ResponseWrite 连接时发生 & CnnErrorsCount & 个错误 & <br>
End If
Set rsTest = ServerCreateObject(ADODBRecordset)
rsTestOpen jobsCnnadOpenForwardOnlyadLockReadOnlyadCmdTable
IfrsTestActiveConnectionErrorsCount > Then
Set Session(Errs) = rsTestActiveConnectionErrors
ResponseRedirect ErrorHandleasp
End If
CnnClose
Set rsTest = Nothing : Set Cnn = Nothing
%>
ErrorHandleasp代码
<%
Dim I
For I = To Session(Errs)Count
ResponseWrite [ & Session(Errs)(I)Source & ]
ResponseWrite Session(Errs)(I)Description & <br>
Next
%>
分析
在本例中错误可能在连接时发生也可能连接是正确的但是在使用Recordset对象时发生了错误
另外在后面的一段代码中将错误集合放入一个会话对象中以便在页面之间调用(遇到错误时转向错误处理页面ErrorHandleasp)
实际上你也完全可以将Recordset对象赋给Session对象以实现记录集在页面之间的调用
三 使用事务
事务这一概念是非常简单和重要的为了说明其用途先假设出现了以下情况例如在电子商务中在网上进行货币转帐时必须从某一帐户中减去某个数额并将其对等数额添加到另一个帐户无论其中的哪个更新失败都将导致帐户收支不平衡(要么这边扣了那边没有增加要么这边没扣那边却增加了)如果使用事务进行这些更改便可确保只能选择进行全部更改或不作任何更改(不是被完全正确执行就是被全部取消)
事务隶属于Connection对象