通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>asp专区>>正文 新版上线![旧版]
注:打开慢时请稍等

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

http://www.iyit.net  日期:2006-5-25 12:13:48  来源:网络转载   点击:
参加讨论】在上两讲中,我们讲解了ASP中数据库的基本使用,今天将介绍几种非常实用的技术。

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

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

三、 使用事务
事务这一概念是非常简单和重要的,为了说明其用途,先假设出现了以下情况:例如在电子商务中,在网上进行货币转帐时,必须从某一帐户中减去某个数额并将其对等数额添加到另一个帐户。无论其中的哪个更新失败,都将导致帐户收支不平衡(要么这边扣了,那边没有增加;要么这边没扣,那边却增加了)。如果使用事务进行这些更改,便可确保只能选择进行全部更改或不作任何更改(不是被完全正确执行,就是被全部取消)。
事务隶属于Connection对象,Connection对象有三个与事务有关的方法:
l BeginTrans 启动新的事务。
l CommitTrans 保存所有更改并结束当前事务。
l RollbackTrans 取消当前事务中所做的任何更改并结束事务,通常称为“回滚”。
我们不妨看一个实例wuf62.asp。
<%@ LANGUAGE="VBSCRIPT" %>
<% Option Explicit %>
<!--#include file="adovbs.inc"-->
<%
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 "发生错误, 系统恢复事务开始时的状态, 既不会新增, 也不会修改" & "<br>"
Cnn.RollbackTrans
Else
Response.Write "没有错误, 保存对数据库的更改, 新增一条数据, 修改一条数据" & "<br>"
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) & "<br>"
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,这个例子还顺带讲解了如何使用循环输出字段值(而以前我们都是用“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 "<Table Border = 2><tr>"

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

While Not rsTest.EOF
Response.Write "<tr>"
'用循环输出每一个字段的值
For I = 0 To rsTest.Fields.Count - 1
Response.Write "<td>" & rsTest(I) & "</td>"
Next
Response.Write "</tr>"
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 %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' 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) & "  "  & "<BR>"
    rsTest.MoveNext       
Loop

Set rsTest = Nothing
%>


编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:ASP中Cookie使用指南
下一篇:ASP实用大全-实战ASP(7)
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
ASP 3.0高级编程(二) ASP 3.0高级编程(四) ASP 3.0高级编程(六)
Asp Object 之:AddHeader Asp Object 之:AppendToLog 如何写出优秀的ASP应用
Asp Object 之:BinaryWrite 在ASP程序中访问Access数据库 Asp Object 之:CacheControl
ASP+Access的安全隐患及对策 Asp Object 之:Clear ASP中数据库调用中常见错误的现象和解决
Asp Object 之:ContentType Asp Object 之:End Asp Object 之:ServerVariables
Asp Object 之:ExpiresAbsolute Asp Object 之:Flush Asp Object 之:Form
ASP初学者常犯的几个错误 ASP:网上通讯簿1.00 asp,php 和 jsp 比较 之我见
刷一次变一次图的ASP代码 在ASP网站设计中表单验证  一段在asp中加密与解密对应的函数
最新更新 热点排行 推荐新闻
ASP 3.0高级编程(二)
ASP 3.0高级编程(四)
模似windows XP 左侧的菜单效果(3)
ASP 3.0高级编程(六)
Asp Object 之:AddHeader
ASP 3.0高级编程(二)
ASP 3.0高级编程(四)
模似windows XP 左侧的菜单效果(3)
ASP 3.0高级编程(六)
Asp Object 之:AddHeader
Asp Object 之:AppendToLog
如何写出优秀的ASP应用
Asp Object 之:BinaryWrite
在ASP程序中访问Access数据库
Asp Object 之:CacheControl
ASP自动解压RAR文件
在ASP中使用SQL语句之3:LIKE、NOT LIK
ASP中使用SQL语句教程
用ASP制作强大的搜索引擎
WEB打印大全
优秀公益广告作品欣赏(8)
java数据类型转换
Windows XP专业版IIS连接数的更改
新开放QQ免费挂级网站
优秀公益广告作品欣赏(7)
免费在QQ上看在线电影电视听音乐
WEB服务器配置全攻略(三)
QQ珊瑚虫外挂4.0版本发布!
免费把QQ炫铃设为本机QQ的系统提示音
Office2007简体中文版浮出水面 美图抢
ASP中使用SQL语句教程
测试一下喽!
如何在Win20003中更好的玩游戏
QQ收费头像免费使用的方法 
微软将在华推分期付款,充值卡PC 可低价
 AMD处理器AM2测试 风扇竟运行7分钟
exeplorer.exe错误的问题的总结、解决
ASP.NET 2.0 中的异步页功能应用
硬盘坏道修复及数据恢复宝典
免费登录搜索引擎入口大全
搜索引擎注册九大秘法
小心摄像头成为黑客偷窥你的眼睛
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息