asp

位置:IT落伍者 >> asp >> 浏览文章

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


发布日期:2018年04月20日
 
ASP讲座之八:ASP与数据库(三)

分页技术

前面我们介绍了如何检索数据并输出到浏览器端对少量数据而言那样简单的输出处理是完全可以的但是若数据量很大有几百条甚至上千条一次将如此多的数据全部输出到客户端是不现实的一来页面从上到下拉得很长二来客户端等待的时间过长三来服务器的负载过大所以采取分页输出非常必要

要求输出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对象               

上一篇:另类:ASP不用DSN访问数据库

下一篇:用ASP完成电子贺卡