您的位置:首页精文荟萃软件资讯 → ASP知识讲座八

ASP知识讲座八

时间:2004/10/7 18:20:00来源:本站整理作者:蓝点我要评论(0)

 ASP与数据库(三)

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

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


<%
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
%>

<% ' 下面部分 输出当前页的数据至浏览器 %>


 
 单价
 产品名称

<% ' 用循环输出当前页的 10 条数据
For absRecordNum = 1 to rsTest.PageSize
%>
 
 <%= rsTest("单价")%>
 <%= rsTest("产品名称")%>

<%
rsTest.MoveNext
If rsTest.EOF Then
Exit For ' 如果已到记录尾, 退出 - 如最后一页数据不满页时
End If
Next

rsTest.Close : Cnn.Close
Set rsTest = Nothing : Set Cnn = Nothing
%>


<% ' 下面部分 是两个按钮 "上一页" "下一页" %>
" Method="Post">
">
<%
If absPageNum > 1 Then '如果当前不是第一页, 则显示上一页按钮 %>

<% End If
If absPageNum <> TotalPages Then '如果当前页不是最后一页, 则显示下一页按钮%>

<% End If %>

 [ 第 <%= absPageNum %> 页, 
共 <%= TotalPages %> 页 ] 



分析:
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 %>

<%
Response.Expires = 0
'下面这句保证: 即使脚本遇到错误, 也继续执行下一句
On Error Resume Next

Dim Cnn, rsTest, Errs, I
Set Cnn = Server.CreateObject("ADODB.Connection")
'CommandTimeout - 与数据库连接的最长等待时间, 缺省为15秒
Cnn.CommandTimeout = 5
'你可以分别在下面三种情况下检测错误发生情况 - 以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 & "
"
Next

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

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

If rsTest.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 & "
"
Next
%>
分析:
在本例中,错误可能在连接时发生,也可能连接是正确的,但是在使用Recordset对象时发生了错误。
另外,在后面的一段代码中,将错误集合放入一个会话对象中,以便在页面之间调用(遇到错误时,转向错误处理页面ErrorHandle.asp)。
实际上,你也完全可以将Recordset对象赋给Session对象,以实现记录集在页面之间的调用。

三、 使用事务
事务这一概念是非常简单和重要的,为了说明其用途,先假设出现了以下情况:例如在电子商务中,在网上进行货币转帐时,必须从某一帐户中减去某个数额并将其对等数额添加到另一个帐户。无论其中的哪个更新失败,都将导致帐户收支不平衡(要么这边扣了,那边没有增加;要么这边没扣,那边却增加了)。如果使用事务进行这些更改,便可确保只能选择进行全部更改或不作任何更改(不是被完全正确执行,就是被全部取消)。 
事务隶属于Connection对象,Connection对象有三个与事务有关的方法:
l BeginTrans 启动新的事务。
l CommitTrans 保存所有更改并结束当前事务。
l RollbackTrans 取消当前事务中所做的任何更改并结束事务,通常称为"回滚"。
我们不妨看一个实例wuf62.asp。
<%@ LANGUAGE="VBSCRIPT" %>
<% Option Explicit %>

<%
Response.Expires = 0
On Error Resume Next

Dim Cnn, StrSQL, rsTest
Set Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"

'开始一个事务
Cnn.BeginTrans
StrSQL = "Insert jobs(job_desc, min_lvl, max_lvl) Values('金融',16,86)" 
Cnn.Execute StrSQL

'下面第一句语句错误, 第二句正确
StrSQL = "Update jobs_err SET job_desc = '事务' Where job_id = 14" 
'StrSQL = "Update jobs SET job_desc = '事务' Where job_id = 14" 
Cnn.Execute StrSQL

If Cnn.Errors.Count > 0 Then
Response.Write "发生错误, 系统恢复事务开始时的状态, 既不会新增, 也不会修改" & "
"
Cnn.RollbackTrans
Else
Response.Write "没有错误, 保存对数据库的更改, 新增一条数据, 修改一条数据" & "
"
Cnn.CommitTrans
End If

Set rsTest = Cnn.Execute("Select * From jobs where job_id>=14")
While Not rsTest.EOF
Response.Write rstest(0) & rstest(1) & rstest(2) & rstest(3) & "
"
rsTest.MoveNext
Wend

'该例仅为测试, 故恢复数据库原来数据
Cnn.Execute "Update jobs SET job_desc = 'Designer' Where job_id = 14"
Cnn.Execute "DELETE jobs Where job_id > 14"

Cnn.Close: Set Cnn = Nothing
%>
本例中,新增(Insert)和修改(Update)要么同时发生,要么都不发生,不会出现新增一条数据,而修改却因为语句错误未发生的情况。在数据库编程时使用事务是一个非常好的习惯。

四、多个记录集的处理
有时候我们需要同时取得两个表的数据,如果放在一条SQL语句中返回,则可以减少网络传输并提高运行效率。
例wuf64.asp,这个例子还顺带讲解了如何使用循环输出字段值(而以前我们都是?quot;rsTest(0) & rsTest(1) & …"这样的笨方法输出的,如果只有两三个字段,用这种方法显然更简洁),如果一时看不明白,请下载简单一点的wuf63.asp,切记!。
<%@ LANGUAGE="VBSCRIPT" %>
<%
Option Explicit
Response.Expires = 0

Dim Cnn, StrSQL, rsTest, I
Set Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open "Provider=sqloledb; User ID=sa; Password=; Initial Catalog=pubs; Data Source=ICBCZJP"

Set rsTest = Server.CreateObject("ADODB.Recordset")

'检索多个记录集
StrSQL = "Select COUNT(*) AS '雇员数' From employee; Select * From jobs" 
rsTest.Open StrSQL, Cnn ', , ,adCmdText

While Not rsTest Is Nothing
Response.Write ""

'rsTest.Fields.Count - 记录集字段个数
For I = 0 To rsTest.Fields.Count - 1
'rsTest(I).Name - 第 I 个字段的字段名
Response.Write "" & rsTest(I).Name & ""
Next
Response.Write ""

While Not rsTest.EOF
Response.Write ""
'用循环输出每一个字段的值
For I = 0 To rsTest.Fields.Count - 1
Response.Write "" & rsTest(I) & ""
Next
Response.Write ""
rsTest.MoveNext
Wend

'读取下一个Recordset对象
Set rsTest = rsTest.NextRecordset
Wend

Cnn.Close
Set rsTest = Nothing: Set Cnn = Nothing
%>
说明:SQL Server数据库支持多个记录集,而Access数据库不支持。

五、 尽早关闭连接,释放资源
在以往的例子中,都是最后关闭连接,然而Connection对象要占用资源,事实上,按下面wuf65.asp所提供的方法,完全可以更早一点关闭连接。
<% @LANGUAGE = VBScript %>


<% ' wuf65.asp
Dim StrSQL, rsTest

StrSQL = "Select * From 运货商"
Set rsTest = server.CreateObject("ADODB.Recordset")
'一定要使用客户端游标, 否则不行
rsTest.CursorLocation = adUseClient
rsTest.Open StrSQL,Cnn,,,adCmdText

'删除记录集对 Connection 对象的依赖
Set rsTest.ActiveConnection = Nothing
'尽可能早的关闭连接
Cnn.close: Set Cnn = Nothing

Do While Not rsTest.EOF 
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "
"
rsTest.MoveNext 
Loop
Set rsTest = Nothing
%>

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本