'****************************************************************** '** 本程序名:"无限流"分页程序
'** 作者:Arbiter(AAsx)
'** 版本:Million Level
'**
'** QQ:22222xx
'** Email:Arbiter@https://www.doczj.com/doc/882269768.html,
'** https://www.doczj.com/doc/882269768.html,/
'****************************************************************** '**
'** 【作者的话】
'**
'** 分页程序无疑是许多网络程序功能中一个比较麻烦的东西,事实上现在'** 为止绝大部分人还是在使用传统的分页方法(Rs.PageSize=xx),而了解'** 数据库操作的人都知道,这种传统方式有个弊端:第一次打开页面时,'** 它会预读所有的记录集,这当在数据大的时候,这将是致命的,而且接'** 下来的翻页速度也会非常慢,很占用资源。对于十万数量级以上的数据'** 库这种传统分页方式已经显得非常无力,更别说百万级了(根本没法操'** 作)。基于这种原因,促使我做了本程序。
'**
'** 【程序功能】
'**
'** 针对大型的数据库进行分页操作,理想的可操作的数据记录量在200万'** 以内(Max Level版将无数量限制,且无论数据库多大,翻页速度都是
'** 不变),这是Million Level版分页程序在赛扬1G、内存512、win2k环'** 境下的测试数据:
'**
'** SQLserver 2k 10万条记录每页显示20条:
'** 平均翻页速度:45ms
'** SQLserver 2k 100万条记录每页显示20条:
'** 平均翻页速度:350ms
'**
'**
'** 【分页原理】
'**
'** 本程序不再使用Rs.PageSize的方式分页,连接数据库的游标类型
'** 也不是使用conn,1,x,而是conn,0,1,这应是最快的游标类型了,不要'** 以为这样会使程序变得复杂,相反,程序非常简单,如果你看不明白,'** 应该是我的编程风格你不习惯,而非程序复杂。
'** "无限流"分页的中心是:每页只读出需要显示的记录,不再象传统
'** 分页程序预读全部的数据,这正在本程序最大的优点--占用资源少,同'** 理速度也得到非常大的提升,特别在数据量越大的时候,它的速度优势'** 越明显(100万记录才350ms左右)。
'** 当程序执行后,使用CurcorBegin和CurcorEnd记录显示的第一条记
'** 录和最后一条记录的ID值,作为下一次翻页的标记,然后利用Top xx取
'** 出需要的数据显示,同时又再对ID值进行记录。
'**
'** 【结言】
'**
'** 本程序为共享版,提供给各程序爱好者研究使用,若要转载、散播、修
'** 改或作其他用途,请尊重作者的辛劳,注明出处。
'** 如果本程序中有错漏、非最优化等缺点,请到https://www.doczj.com/doc/882269768.html,的Web开发/
'** ASP栏目中发表讨论,为了中国软件事业的发展,请不要固步自封:)
'**
'********************************************************************
Option Explicit
'Response.Flush
Dim BeginTime,EndTime
BeginTime=Timer
Dim conn,SQLstr,Rs,DefRecordNum,CursorBegin,CursorEnd,CurPageNum,hav DefRecordNum=20
'--------------获取相关参数----------
If Request("CursorBegin")="" Then CursorBegin=0 Else CursorBegin=Request("CursorBegin")
If Request("CursorEnd")="" Then CursorEnd=0 Else CursorEnd=Request("CursorEnd") If Request("CurPageNum")<>"" Then
CurPageNum=CLng(Request("CurPageNum"))
If CurPageNum<=0 Then CurPageNum=1
Else
CurPageNum=1
End If
hav=Request("hav")
If hav="" Then hav="next"
'----------------End-----------------
'------------显示翻页内容函数--------
Function TurnPageFS(DispRecordNum)
Dim n
While Not(Rs.Eof) And n n=n 1 Response.Write " " " " " " " ""&_ ""&Rs(0)&" "&_"&Rs(1)&" "&_"&Rs(2)&" "&_"&Rs(3)&" "&_"&Rs(4)&" "&_"&Rs(5)&" "&_
If n=1 Then CursorBegin=Rs(0)
If n=DefRecordNum Or Rs.Eof Then CursorEnd=Rs(0)
Rs.MoveNext
Wend
End Function
'-------------连接数据库-------------
Set conn=Server.CreateObject("Adodb.Connection")
'SQLstr="Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="&Server.Mappath("mldata.mdb")
SQLstr="Driver={SQL
Server};server=arbiter;uid=arbiter;pwd=123456;database=mldata"
conn.Open SQLstr
'---------统计总记录数/总页数---------
'-PS:推荐使用count(ID),ID为自动编号且索引,否则速度有可能大打折扣
'-PS:此统计是本程序中最耗资源的一部分,如果取消这段程序,速度会快上10倍左右Dim TotalRecords,TotalPages
SQLstr="Select count(ID) As RecordSum From ABC"
Set Rs=conn.Execute(SQLstr,0,1)
TotalRecords=Rs("RecordSum")
TotalPages=Abs(Int(TotalRecords/DefRecordNum*(-1)))
Rs.Close
Set Rs=Nothing
'--------根据hav选择相应的SQL字串-----
Select Case(hav)
Case "back"
CursorEnd=CursorBegin
SQLstr="Select Top "&DefRecordNum&"_
ID,Title,FileName,K,ImgSize,NameSon _
From ABC Where ID<"&CursorBegin&_
" And ID In (Select Top "&DefRecordNum_
&" ID From ABC Where ID<"&CursorBegin_
&" Order by ID DESC) Order by ID"
Case "next"
SQLstr="Select Top "&DefRecordNum_
&" ID,Title,FileName,K,ImgSize,NameSon From ABC Where ID>"&CursorEnd&_
" Order by ID"
End Select
Set Rs=conn.Execute(SQLstr,0,1)
%>
<%Response.Write CurPageNum&"/"&TotalPages&"页总记录数:"&TotalRecords%> | 首页 上一页 下一页 |
ID | Title | FileName | 大小 | 尺寸 | 类别 |
<%Response.Write CurPageNum&"/"&TotalPages&"页总记录数:"&TotalRecords%> | 首页 上一页 下一页 |
<%
EndTime=Timer
Response.Write "
程序执行时间:"&(EndTime-BeginTime)*1000&"毫秒"
Response.Write " 第一条记录的ID值(CursorBegin)="&CursorBegin&" "
Response.Write "最后一条记录的ID值(CursorEnd)="&CursorEnd&"
"
%>
function turnpage(func){
var CurPageNum=<%=CurPageNum%>; //取得当前页码
var CursorBegin=<%=CursorBegin%>; //取得第一个显示的记录的ID值
var CursorEnd=<%=CursorEnd%>; //取得最后一个显示的记录的ID值
var TotalPages=<%=TotalPages%>; //取得页面总数
var BackUrl='mllist.asp?CurPageNum=' (CurPageNum-1) '&CursorBegin=' CursorBegin '&CursorEnd=' CursorEnd '&hav=back';
var NextUrl='mllist.asp?CurPageNum=' (CurPageNum 1) '&CursorBegin=' CursorBegin '&CursorEnd=' CursorEnd '&hav=next';
if(CurPageNum<=1 && func=='back'){
location.href='#';
}else if(CurPageNum>=TotalPages && func=='next'){
location.href='#';
}else if(func=='back'){
location.href=BackUrl;
}else if(func='next'){
location.href=NextUrl;
}
}
Cnbruce的代码:
分页样例:[首页] [上页] [下页] [尾页] [页次:4/5页] [共86篇 20篇/页] 转到:_ 页以下为公用代码,必须具备。
<%filepath=request.servervariables("path_info")%>
<%page=1 '设置变量初始值PAGE=1
page=request.querystring("page") 'page值为接受值
rs.PageSize = 20 '每页显示记录数
if Not IsEmpty(trim(Request("Page"))) then '如果PAGE已经初始化...
Page = CInt(Request("Page")) '接收PAGE并化为数字型赋给PAGE变量
if Page > rs.PageCount then '如果接收的页数大于总页数
rs.AbsolutePage = rs.PageCount '设置当前显示页等于最后页
elseif Page <= 0 then '如果page小于等于0
Page = 1 '设置PAGE等于第一页
else
rs.AbsolutePage = Page '如果大于零,显示当前页等于接收的页数
end if
End if
Page = rs.AbsolutePage%>
第一种分页
<%if rs.pagecount<>1 and rs.pagecount<>0 then%>'首先判断页总数不为1和0 <%if page>1 then%>
<%if page
[首页]
[上一页]
[下一页]
[尾页]
<%else%>
[首页]
[上一页]
[下一页] [尾页]
<% end if %>
<%else%>
[首页] [上一页]
[下一页]
[尾页]
<%end if %>
<%else%>
[首页] [上一页] [下一页] [尾页]
<%end if%> https://www.doczj.com/doc/882269768.html,
第二种分页
<%if rs.pagecount<>1 and rs.pagecount<>0 then%>
<%if page>1 then%>
[首页]
[上一页]
<%if page
[下一页]
[尾页]
<%else%>
[下一页] [尾页]
<% end if %>
<%else%>
[首页] [上一页]
[下一页]
[尾页]
<%end if %>
<%else%>
[首页] [上一页] [下一页] [尾页]
<%end if%>
第三种
<%if rs.pagecount<>1 and rs.pagecount<>0 then%>
<%if page
<%if page=1 then %>
[首页] [上一页]
<%else%>
[首页]
[上一页]
<% end if %>
[下一页]
[尾页]
<%else%>
[首页]
[上一页]
[下一页] [尾页]
<%end if %>
<%else%>
[首页] [上一页] [下一页] [尾页]
<%end if%>
在微软的ASP编程体系中,ADO对象的建立,使得从网页访问数据库成为一件易事,特别是ADO的Recordset对象使得控制数据的输出显示更为方便、自由。而在Visual InterDev6.0(以下简称VI6.0)中,由于Script Object Model(以下简称SOM)、Design-Time Control(以下简称DTC)以及Data Environment Object Model(以下简称DEOM)等对象模型的引入,使网页对数据库的访问设计显得更为方便。
因为主题方面的原因,关于数据库的连接,下文只给出代码和简要注释,而把重点放在如何利用Recordset对象(或控件)实现数据记录的分页显示方面。根据我的理解,分页显示的关键就在于对ADO的Recordset对象或DTC(设计时控件)的Recordset控件的属性和方法的熟练把握上。
这七种分页显示的武器概括起来说分四类:
第一、二种我暂取名叫“纯ASP法”,这也是国内的ASP网站上用得最多的方法,它们的区别仅在实现技巧的不同。这两种方法的实现最易理解,用到的对象概念也最少,对开发环境的要求也最低(只要记事本就行)。可以说,这两种方法的实质还是CGI的编程思想,只是在程序中引入了ADO对象而已。
第四、五种暂取名叫“SOM的DHTML法”。这两种方法要求在VI6.0的环境下,利用微软提出的脚本对象模型(Script Object Model)和DHTML中Table对象的与数据库绑定的新特性(许多书和文章只介绍了DHTML的CSS特性在样式设计中的运用而忽略介绍其数据绑定特性),实现在客户端控制翻页。但它要求用户的浏览器必须是支持DHTML,如:Microsoft Internet Explorer 4.0及以上的版本。
第六种暂取名叫“SOM服务器端法”。要求在VI6.0的环境下开发,它利用微软提出的脚本对象模型(Script Object Model)中的几个DTC控件:Recordset、PageObject、Grid 等在服务器端(客户端)实现翻页控制。这是一种激动人心的、全新的编程方法,它把网页看成对象(这种对象模型和传统的DOM----document object model是有区别的:DOM只能控制客户端,而SOM可控制服务器端和客户端),它真正实现了网页的面向对象编程。但遗憾的是,也许是我个人能力有限,这种技术我个人认为还不是很成熟,比如,与浏览器的结合还不是很好,这将在后文详细说明。
第七种暂取名叫“DEOM法”。它也是利用了VI6.0中建立的数据环境对象模型(Data Environment Object Model)建立Recordset对象。这也是在网页编程上比较少见的新方法,与SOM模型相比,自有它的优点,这将在后文详述。
在后面所举的所有例子源代码,都可以直接拷贝使用,你甚至可以不懂其原理,只要把其中的粗斜体字部分换成相应自己的数据库名或字段名就可以了。
在开始详细介绍各种分页方法前,让我们先创建一个数据库:用Office97中的access 自创一个Employee.mdb,其中建一个表emp,只设三个字段:emp ID,last name和first name。为什么这么简单,是因为我们关心的是怎样处理recordset的结果。
第一种:参数直接代入法
这种方法是用手工建立Recordset对象,利用其pagesize(每页指定显示记录数),pagecount(总页码数)和absolutepage(当前页码数)属性来控制分页的输出。分页采用<href>直接带页码参数的方法来控制翻页。网页的名字为emp1.asp。源代码如下:
<%//建立与employee.mdb数据库的连接。
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=employee.mdb"
//建立emp表的Recordset对象实例rs。
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "emp", conn, 3
PageSize = 10 //pagesize属性指定了每页要显示的记录条数
Page = CLng(Request("Page")) ’string型转化为long型
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
If Page <> 1 Then
Response.Write "<A HREF=emp1.asp?Page=1>第一页</A>?"
Response.Write "<A HREF=emp1.asp?Page=" & (Page-1) & ">上一页</A>?"
End If
If Page <> rs.PageCount Then
Response.Write "<A HREF=emp1.asp?Page=" & (Page+1) & ">下一页</A>?"
Response.Write "<A HREF=emp1.asp?Page="&rs.PageCount & ">最后一页</A>?"
End If
Response.write"页码:" & Page & "/" & rs.PageCount & "</font>"
//每一页的显示
//显示表头
Response.Write "<CENTER><TABLE BORDER=1>"
Response.WRITE "<TR><TD>" & rs.Fields("emp ID").Name & "</TD>" Response.WRITE "<TD>" & rs.Fields("last name").Name & "</TD>"
Response.WRITE "<TD>" & rs.Fields("first name").Name & "</TD></TR>"
//循环显示每条记录
rs.AbsolutePage = Page //把页码赋给absolutepage属性从而知当前页的首条记录号
For iPage = 1 To rs.PageSize //
Response.WRITE "<TR><TD>" & rs.Fields("emp ID").Value & "</TD>" Response.WRITE "<TD>" & rs.Fields("first name").Value & "</TD>" Response.WRITE "<TD>" & rs.Fields("last name").Value & "</TD></TR>"
rs.MoveNext
If rs.EOF Then Exit For
Next
Response.Write "</TABLE></CENTER>"%>
第二种:表单传送参数法
这种方法在创建Recordset对象时与第一种相同,只是在翻页控制时,采用<input>
和case语句配合来实现翻页。网页的名字为:emp2.asp。此方法在编程逻辑上有个缺点:就是在按过“上页”或“下页”钮后,再在浏览器上按刷新按钮时,会自动翻页。源代码如下:
if Pagenum = "" Then Pagenum = 1 //从第一页开始显示
//建立数据库连接和Recordset对象实例rs。
与第一种方法相同,此处略过。
RS.Pagesize = 10 ’ 设置一页中显示的记录条数为10条
// 确定翻页的动作
Select Case Request("NAV")
Case ""
session("Pagenum") = 1
case "First" ’ First Record
session("Pagenum") = 1
case "Prev" ’ Previous Record
if session("Pagenum") > 1 then
session("Pagenum") = session("Pagenum") - 1
End If
case "Next" ’ Next Record
if session("Pagenum")< RS.PageCount then
session("Pagenum") = session("Pagenum") + 1
End if
case "Last" ’ Last Record
session("Pagenum") = RS.PageCount
End Select
RS.Absolutepage = Clng(session("Pagenum")) //确定当前页的第一条记录号
// 显示当前页
同第一种方法,此处略过。
// Nav 翻页按钮设置
<form method="GET" action="emp2.asp">
<input type="submit" name="NAV" Value="首页">
<input type="submit" value="上页" name="NAV">
<input type="submit" value="下页" name="NAV">
<input type="submit" value="末页" name="NAV"></form>
第三种:用Grid控件设计分页
所有的方法中,这种方法最容易。你只需拖DTC中的Recordset控件和Grid控件到asp 网页中就行了。而且,你还能选择是在服务器平台还是在客户端平台控制翻页。缺点就是你必须用它给定的格式显示,而不能自己自由控制表格的显示格式。
方法如下:
在VI6.0中建一个工程emp.vip。再在工程中添加一个asp网页:emp3.asp。
第一步:选VI6.0菜单条上的“add data connect…”,按开发工具的导航提示,你就可以很容易地建立与Employee.mdb数据库的连接。从DTC工具栏中拖一个Recordset控件到网页中,并设置其属性。具体如图:
当你拖控件到网页中时,VI6.0会自动提示你“是否使用Scripting object model”,按yes。
第三步:从DTC工具栏中拖一个Grid控件到网页中,然后单击鼠标右键,设置其属性,如:选在第二步中创建的Recordset控件名,选择emp表中的字段,每页显示多少条记录以及显示格式等。非常简单方便,只要照着导航提示做就行了。
第四种:DHTML法一。
数据记录显示在一个HTML表中。它利用DHTML中表的数据绑定特性来控制记录的分页显示。缺点就是你的翻页方法将被限制为一种特定的方式:只能“上页”和“下页”而不能“首页”和“末页”。由于是在客户端控制翻页,所以,这种和第五种方法是速度最快的,但遗憾的是它只能在支持DHTML的浏览器上使用。
在DHTML中,<TABLE>的DATASRC属性可使表格绑定到一个数据源,另一个属性DATAPAGESIZE可指定一页一次显示的记录数。
我们来看下面的例子:
第一步:拖Recordset控件到新建的网页emp4.htm中,设置其属性,方法同第三种,此处略。
第二步:输入下面的代码:
<TABLE ID="Table1" DATASRC="#Recordset1_RDS" DATAPAGESIZE=5> //假定前面设定Recordset控件名为Recordset1。每页显示5条记录。
<THEAD>
<TH ALIGN="left" WIDTH=150>Emp ID</TH> //输出表头
<TH ALIGN="left" WIDTH=200>Last Name</TH>
<TH ALIGN="left" WIDTH=200>First Name</TH>
</THEAD>
<TR>
<TD><DIV DATAFLD="Emp ID"></DIV></TD> //输出表内容
<TD><DIV DATAFLD="Last Name"></DIV></TD>
<TD><DIV DATAFLD="First Name"></DIV></TD>
</TR>
</TABLE>
第三步:然后,增加一对DTCs Button按钮控件来做翻页导航,一个命名为
“btnPrevious”(上一页),一个命名为“btnNext”(下一页)。它们相应的脚本如下:
<SCRIPT LANGUAGE=VBScript>
Function btnPrevious_onclick()
Table1.previousPage()
End Function
Function btnNext_onclick()
Table1.nextPage()
End Function
</SCRIPT>
第五种:DHTML法二
这种方法是对第四种方法的完善。采用手工编写脚本的方法,使我们能做“首页”,“末页”翻页导航按钮,并能确定每条记录的位置(记录号)。由于篇幅的关系,我在下面只介绍一个具体例子,并给出简要说明。其它关于DHTML和Recordset控件的一些属性和方法请读者自行参照相关书籍。这里需要提请注意的是,Recordset控件与第一、二种方法中介绍的ADO的Recordset对象有些不同:Recordset控件没有直接给出pagesize和pagecount等属性,需要用下面介绍的方法来计算。
第一步:拖Recordset控件到新建的网页emp5.htm中,名字为Recordset1,设置其属性,方法同第三种,此处略。
第二步:定义三个全局变量和编写Recordset1的ondatasetcomplete(数据设置完成时)脚本。
Dim gCurrentPageNumber //当前页号
Dim gMaxPageNumber //最大页数
Dim gRecordsPerPage //每页显示记录数
gRecordsPerPage = 5 // 设置每页显示记录数为5条记录。
Function Recordset1_ondatasetcomplete()
totalRecordCount = Recordset1.getCount() //总的记录条数
gMaxPageNumber = Int(totalRecordCount / gRecordsPerPage) //获得最大页数
If (totalRecordCount Mod gRecordsPerPage) > 0 then
gMaxPageNumber = gMaxPageNumber + 1
End If
End Function
第三步:创建翻页导航按钮。
Function btnFirst_onclick() ’ 翻到首页
gCurrentPageNumber = 1
DisplayData()
End Function
Function btnPrevious_onclick() ’ 翻到上一页
if gCurrentPageNumber > 1 Then
gCurrentPageNumber = gCurrentPageNumber - 1
DisplayData()
End If
End Function
Function btnNext_onclick() ’ 翻到下一页
if gCurrentPageNumber < gMaxPageNumber Then
gCurrentPageNumber = gCurrentPageNumber + 1
DisplayData()
End If
End Function
Function btnLast_onclick() ’翻到末页
gCurrentPageNumber = gMaxPageNumber
DisplayData()
End Function
第四步:编写显示每一页的函数。其中使用了许多DHTML的属性和方法,请读者自行参考相关书籍。
Sub DisplayData()
startRecord = ((gCurrentPageNumber - 1) * gRecordsPerPage) + 1 //计算每一页开始显示的记录号数(位置,第几条)
rowCtr = 1
lblPageNumber.innerHTML = gCurrentPageNumber & "/" & gMaxPageNumber
For recordPtr = startRecord To (startRecord + gRecordsPerPage - 1) //循环显示一页的各条记录
If recordPtr > Recordset1.getCount() Then //显示空表
Table1.rows(rowCtr).cells(0).innerHTML = "<P></P>"
Table1.rows(rowCtr).cells(1).innerHTML = "<P></P>"
Table1.rows(rowCtr).cells(2).innerHTML = "<P></P>"
Table1.rows(rowCtr).cells(3).innerHTML = "<P></P>"
Else //具体显示每一页
Recordset1.moveAbsolute(recordPtr) //移动记录指针。
empID = Recordset1.fields.getValue("emp ID")
empLName = Recordset1.fields.getValue("first name")
empFName = Recordset1.fields.getValue("last name")
Table1.rows(rowCtr).cells(0).innerText = recordPtr ’ Counter
Table1.rows(rowCtr).cells(1).innerText = empID
Table1.rows(rowCtr).cells(2).innerText = empLName
Table1.rows(rowCtr).cells(3).innerText = empFName
End If
rowCtr = rowCtr + 1
Next
End Sub
另外,我们还需要在window对象的onload事件中编写如下脚本:
For rowCtr = 1 to gRecordsPerPage
Table1.insertRow(rowCtr) ’ 插一新列
For cellCtr = 0 to 3
Table1.rows(rowCtr).insertCell()
Next
Next
第六种:服务器端控制翻页方法。
如果我们在服务器端对数据进行分页形成HTML语句后再输出到客户端,就不会存在浏览器不支持DHTML的问题了。可是用服务器端法使得我们每次翻页时,都得让Recordset控件重新产生一次,因此速度肯定要比用DHTML的方法慢。但如果服务器足够快的话,这点慢客户是察觉不到的。
下面的例子中,我将介绍一个新的DTC控件:PageObject。这个控件使被指定的网页成为一个网页对象,用户在此网页的服务器脚本中组织的子程序和函数可被看作是该网页对象的方法。它提供了管理状态信息的一种先进的方法:网页对象有一些属性(变量),用户可以定义这些属性的生存期。因为以上这些特性,使我们在编制翻页的脚本时非常方便。
但这种方法的缺点是:当你按了“上页”或“下页”按钮后,再浏览器上的按刷新按钮,网页会自动翻页。另外,如果按了浏览器上的“回退”按钮后,再按翻页按钮,可能会出现一次乱翻。这都是因为网页对象属性(全局变量)造成的。
第一步:拖Recordset控件到新建的网页emp6.asp中,名字为Recordset1,设置其属性,方法同第三种,此处略。
第二步:拖PageObject控件到网页中,取名叫emplist。然后右键单击此控件打开属性页并设置MaxPageNumber,RecordsPerPage,CurrrentPageNumber三个属性(全局变量)。VI6.0可用get和set方法来读写它们的值,具体用法请查阅相关资料。
第三步:编写Recordset1的ondatasetcomplete事件。
Function Recordset1_ondatasetcomplete()
recordsPerPage = 5
empList.setRecordsPerPage(recordsPerPage)//设置网页对象每页记录条数属性为5 totalRecordCount = Recordset1.getCount()//获得记录集的总条数
mpn = Int(totalRecordCount / recordsPerPage) //计算出mpn为总页数
If (totalRecordCount Mod recordsPerPage) > 0 then
mpn = mpn + 1
End If
empList.setMaxPageNumber(mpn)
End Function
第四步:拖四个button控件到网页中,编写翻页控制脚本。我们主要是通过改变网页对象的CurrentPageNumber属性的值来实现翻页。
Function btnFirst_onclick()’ 翻到首页
empList.setCurrentPageNumber(1)
End Function
Function btnPrevious_onclick()’ 翻到上一页
cpn = empList.getCurrentPageNumber()
if cpn > 1 Then
empList.setCurrentPageNumber(cpn - 1)
End If
End Function
Function btnNext_onclick()’ 翻到下一页
cpn = empList.getCurrentPageNumber()
if cpn < empList.getMaxPageNumber() then
empList.setCurrentPageNumber(cpn + 1)
End If
End Function
Function btnLast_onclick() ’ 翻到末页
empList.setCurrentPageNumber( empList.getMaxPageNumber() )
End Function
为保证首次进入该页时,显示的是第一页,我们还得编写该网页对象的onEnter事件。
Function empList_onEnter()
If empList.firstEntered Then
empList.setCurrentPageNumber(1)
End If
End Function
第五步:编写显示每一页的脚本。
<HR><TABLE BORDER=0><TR>//显示表头
<TH ALIGN="left" WIDTH=35></TH>
<TH ALIGN="left" WIDTH=150>Emp ID</TH>
<TH ALIGN="left" WIDTH=200>Last Name</TH>
<TH ALIGN="left" WIDTH=200>First Name</TH></TR>
<%
pageNumber = empList.getCurrentPageNumber()//计算翻页所需的各种参数,同DHTML法二recordsPerPage = empList.getRecordsPerPage()
startRecord = ((pageNumber - 1) * recordsPerPage) + 1
lastRecord = Recordset1.getCount()
For recordPtr = startRecord To (startRecord + recordsPerPage - 1)%>
<%If Recordset1.EOF = True Then%>
<TR>
<TD></TD>
<TD></TD>
<TD></TD>
<TD></TD>
</TR>
<%Else%>
<%Recordset1.moveAbsolute(recordPtr)%>
<TR>
<% If recordPtr <= lastRecord Then %>
<TD><%=recordptr%></TD>
<%Else%>
<TD></TD>
<% End If %>
<TD><%=Recordset1.fields.getValue("emp ID")%></TD>
<TD><%=Recordset1.fields.getValue("last name")%></TD>
<TD><%=Recordset1.fields.getValue("first name")%></TD>
</TR>
<%End If%>
<%Next%>
</TABLE><HR>
第七种:Data Environment Object Model(数据环境对象模型)法
Data Environment对象模型把ADO对象模型及它的对象----“Connection”,“Command”,“Recordset”,“Field”以及“Parameter”对象----抽象到一个更加容易的表单中。Data Environment Object Model把命令显露为方法。用户可以调用这些方法,这些方法会执行这些命令并返回所得到的记录集。关于DEOM对象模型详细资料请参考相关书籍。我们来看下面网页emp7.asp的例子:
第一步:在VI6.0的“project Explorer”窗口中的工程项目上右击鼠标并从弹出式菜单选择“Add Data Connection”。根据VI给出的导航提示建立一个到数据库的连接之后,用户就添加了一个实现从ASP应用程序访问数据库的数据命令。同时,你将会在“Project Explorer”窗口中的global.asa文件下方看到一个“Data Environment”对象。
第二步:右击“Data Environment”对象然后从弹出式菜单中选择“Add Data Command”选项,添加一个数据命令Command1。根据VI6.0的导航提示,你可以在Command1 Properties 弹出窗口的Genetal页中选SQL Statement,输入:select * from emp。按OK返回。
第三步:你创建了这个数据命令后,就已经为该Data Environment对象创建了一个方法,然后就可以从脚本中调用这个方法,而且该方法将会给用户返回一个记录集。
thisPage.createDE() //在SOM模式下,thisPage表示当前网页对象,createDE()方法创建了DE对象。
https://www.doczj.com/doc/882269768.html,mand1//执行DE对象的命令,后面可代参数,做有条件查询时很有用。
Set rs=DE.rsCommand1//DE.rscommand1使得rs对象完全等同于一个ADO的Recordset对象。
第四步:因为rs为ADO对象,所以,以下的实现翻页代码完全参照以上介绍的几种方法,此处略过。
其它还有如FrontPage2000的数据库导航中实现的方法等,因与本主题无关,此处略。
综上所述,前面介绍的每种方法都包含了很多新的技术,由于篇幅的关系,无法深入。本文只是想通过实现翻页这一具体的例子来介绍ASP网页编程的多种方法;让大家亲身体验一下VI6.0在编制网页中的强大功能;了解和熟悉微软在网页编程中提出的ADO、DHTML、DTC 控件、SOM对象模型和DEOM对象模型的使用方法;希望能给大家在编制网页时提供更多的选择和参考。
分页显示
<%set rs=server.createobject("adodb.recordset")
rs.open "select * from givewant where flag=1 order by time1 desc",conn,1,1
if rs.recordcount=0 then
%>
<%
response.end
Else
set rs2=server.createobject("adodb.recordset")
rs2.open "select * from givewant where flag=1 order by time1 desc",conn,1,1 if rs2.recordcount>0 then
rs2.PageSize =15 '每页记录条数
iCount=rs2.RecordCount '记录总数
iPageSize=rs2.PageSize
maxpage=rs2.PageCount
page=request("page")
if Not IsNumeric(page) or page="" then
page=1
else
page=cint(page)
end if
if page<1 then
page=1
elseif page>maxpage then
page=maxpage
end if
rs2.AbsolutePage=Page
if page=maxpage then
x=iCount-(maxpage-1)*iPageSize
else
x=iPageSize
end if
For i=1 To x
%>
<%response.write ""
if len(trim(rs("content")))>15 then
response.write left(trim(rs2("content")),13)&".."
else
response.write trim(rs2("content"))
end if
response.write " &n bsp; 详情..."
%>
<%=rs2("faburen")%>
<%
rs2.movenext
next
call PageControl(iCount,maxpage,page,"border=0 align=center","
") end if
rs2.close
set rs2=Nothing
Sub PageControl(iCount,pagecount,page,table_style,font_style)
'生成上一页下一页链接
Dim query, a, x, temp
action = "http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("SCRIPT_NAME")
query = Split(Request.ServerVariables("QUERY_STRING"), "&")
For Each x In query
a = Split(x, "=")
If StrComp(a(0), "page", vbTextCompare) <> 0 Then
temp = temp & a(0) & "=" & a(1) & "&"
End If
Next
Response.Write("
End Sub
%>
<%
end If
%>
<%
if session("admin")="" then
conn.close
set conn = nothing
response.Write ""
response.End
else
if request.cookies("sundxshop")("admin")="" then
conn.close
用ASP连接数据库的几种方法 用ASP连接DBF、DBC、MDB、Excel、SQL Server型数据库的方法: 一、ASP的对象存取数据库方法 在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:Connection、Recordset 、Command Connection:负责打开或连接数据 Recordset:负责存取数据表 Command:负责对数据库执行行动查询命令 二、连接各数据库的驱动程序 连接各数据库可以使用驱动程序,也可以使用数据源,不过我建议大家使用驱动程序,因为使用驱动程序非常方便、简单,而使用数据源比较麻烦。 驱动程序适用数据库类型 Microsoft.Jet.OLEDB.4.0 Mdb Microsoft Access Driver Access Microsoft dBase Driver Dbase Microsoft Excel Driver Excel Microsoft Visual FoxPro Driver Dbc SQLOLEDB.1 SQL srver7.0 而我们在一般情况下使用Access的数据库比较多,在这里我建议大家连接Access数据库使用下面的方法: dim conn set conn = server.createobject("adodb.connection") conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("../db/bbs.mdb") 其中../db/bbs.mdb是你的数据库存放的相对路径!如果你的数据库和ASP文件在同一目录下,你只要这样写就可以了:
下面是虚机维护中,经常碰到的一些ASP程序中的数据库调用的错误,现收集整理如下:ADODB.Recordset 错误'800a0bb9' 变量或者类型不正确,或者不在可以接受的范围之内,要不就是与其他数据冲突。 产生错误可能原因: 1.这个错误多出现在类似语句处:“rs.Open sql,conn,1,1”,原因是数据库连接conn对象未打开。 ―――――――――――――――――――――――――――――――――――― 不能打开注册表关键字(8007000e) Microsoft OLE DB Provider for ODBC Drivers 错误'8007000e' [Microsoft] [ODBC Microsoft Access Driver]常见错误不能打开注册表关键字'Temporary (volatile) Jet DSN for process 0x11b4 Thread 0x1a4c DBC 0x9d34354 Jet'。 产生错误可能原因: 1.打开数据库时写法不对,标准的ACCESS数据库调用写法: "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("db.MDB") 2. 正在上传数据库文件。―――――――――――――――――――――――――――――――――――― 参数不足,期待是1 (80040e10) Microsoft OLE DB Provider for ODBC Drivers 错误'80040e10' [Microsoft][ODBC Microsoft Access Driver] 参数不足,期待是1。 产生错误可能原因: 1.打开数据的SQL查询语句WHERE后面条件子句有问题,一般是缺少逻辑比较符号或者是字段名不正确。 ―――――――――――――――――――――――――――――――――――― 一般性网络错误。请检查网络文档(80004005)
ASP连接Access或SQLServer数据库的终极代码 作者:佚名来源:本站整理发布时间:2010-01-11 10:26:29 搞了这么久的ASP,希望本篇能帮助一些初学者。 <% On Error Resume Next Dim Data_base Data_base = 0 '1为MSSQLServer2000 其它为Access Set Conn=Server.CreateObject("Adodb.Connection")
IF Data_base=1 Then '------------------------------------------------------------------------------------- Dim dbconn,dbip,dbdns,dbname,dbuid,dbpwd dbconn = 1 '链接方式1为OLEDB链接2为驱动链接3为DNS链接dbip = "(local)" '数据库所在的IP地址,如果是本地数据库则为:"(local)" dbdns = "数据源DNS名称" '数据库DNS名 dbname = "MSOW" '数据库名称 dbuid = "sa" '数据库用户名 dbpwd = "********" '数据库密码 '------------------------------------------------------------------------------------- Select CASE dbconn
Case 1 Conn.Open "Provider=SQLOLEDB;User ;Password="&dbpwd&";Initial Catalog="&dbname&";Data Source="&dbip&";" Case 2 Conn.open "DRIVER={SQL Server};SERVER="&dbip&";UID="&dbuid&";PWD="&dbpwd&";DATABASE="&dbname&"" Case 3 Conn.open "DSN="&dbdns&";UID="&dbuid&";PWD="&dbpwd&";DATABASE="&dbname&"" End Select Else '-------------------------------------------------------------------------------------
asp数据库数据生成excel文件:
(一)数据库的选择: 有许多的数据库你可以选择,SQL SERVER、ACCESS(*.mdb)、EXCEL(*.xls)、FOXPRO(*.dbf)甚至普通的文本文件(*.txt)都可以达到存储数据的功能。那么到底选择什么数据库最合适呢?其中SQL SERVER是服务器级的,足以应付每天上万次的访问量。对于非服务器级的数据库建议使用ACCESS97。 因为: (1)只要安装了PWS或IIS4肯定有ACCESS的ODBC驱动,即你的系统肯定支持ACCESS数据库的存取。 (2)ACCESS支持的SQL指令非常齐全。 (3)ACCESS ODBC驱动程序的效率非常高。虽然它不是服务器级的数据库,但是作为中小型企业内部网的数据库支持还是绰绰有余的。 (4)ACCESS97在OFFICE97中就有,非常方便得到和使用。 本文就以ACCESS数据库为准介绍基于WEB的数据库存取方法。 (二)例子:我们建立一个“客户”数据库,需要保存如下的客户资料:客户名称、联络人姓名、所在城市、电话号码。 (1)首先建立ACCESS数据库customer.mdb(今后有用的)。 建立如下字段:客户名称、联络人姓名、所在城市、电话号码、客户编号、时间。将表保存为" 客户"(今后有用的,===>看看图)。注意:建立字段时多作了2个(客户编号、时间),因为在今后排序时要用到它们。建议今后做数据库时最好都加上这2项,不会没用的。此外,在保存表时ACCESS 会询问是否建立一个住关键字,我们不需要它所以不必建立。还有:时间字段的"默认值"设成"now()",即去系统当时的时间。同时将索引项设成"有(允许重复)",含义:WEB上极有可能同时存取数据,所以允许重复,索引设成"有"可以加快排序速度。===>看看图 (2)建立递交表单add.htm: 源代码如下:
添加数据库记录