当前位置:文档之家› ASP分页代码(大型数据库)的

ASP分页代码(大型数据库)的

ASP分页代码(大型数据库)的
ASP分页代码(大型数据库)的

'****************************************************************** '** 本程序名:"无限流"分页程序

'** 作者:Arbiter(AAsx)

'** 版本:Million Level

'**

'** QQ:22222xx

'** Email:Arbiter@https://www.doczj.com/doc/dd8708351.html,

'** https://www.doczj.com/doc/dd8708351.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/dd8708351.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)

%>

"无限流"分页程序作者:Arbiter

<%Response.Write CurPageNum&"/"&TotalPages&"页总记录数:"&TotalRecords%>首页 上一页 下一页

<%

TurnPageFS(DefRecordNum)

Rs.Close

Set Rs=Nothing

conn.Close

Set conn=Nothing

%>

IDTitleFileName大小尺寸类别

<%Response.Write CurPageNum&"/"&TotalPages&"页总记录数:"&TotalRecords%>首页 上一页 下一页

<%

EndTime=Timer

Response.Write "
程序执行时间:"&(EndTime-BeginTime)*1000&"毫秒"

Response.Write " 第一条记录的ID值(CursorBegin)="&CursorBegin&" "

Response.Write "最后一条记录的ID值(CursorEnd)="&CursorEnd&"

"

%>

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/dd8708351.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 btnFirs t_onclick() ’ 翻到首页

gCurrentPageNumber = 1

DisplayData()

End Function

Function btnPrevious_onclick() ’ 翻到上一页

if gCurrentPageNumber > 1 Then

gCurrentPageNumber = gCurrentPageNumber - 1

DisplayData()

End If

End Function

Functi on 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/dd8708351.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

%>

<%=rs2("givewanttitle")%>

 

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

" & vbCrLf )

Response.Write("

" & vbCrLf )

Response.Write("

" & vbCrLf )

Response.Write("

" & vbCrLf )

Response.Write("

" & vbCrLf )

Response.Write(font_style & vbCrLf )

if page<=1 then

Response.Write ("首页 " & vbCrLf)

Response.Write ("上一页 " & vbCrLf)

else

Response.Write("首页 " & vbCrLf)

Response.Write("上一页 " & vbCrLf)

end if

if page>=pagecount then

Response.Write ("下一页 " & vbCrLf)

Response.Write ("尾页 " & vbCrLf)

else

Response.Write("下一页 " & vbCrLf)

Response.Write("尾页 " & vbCrLf)

end if

Response.Write(" 页次:" & page & "/" & pageCount & "页" & vbCrLf)

Response.Write(" 共有 " & iCount & " 条信息" & vbCrLf)

Response.Write(" 转到" & "" & "页" & vbCrLf & "")

Response.Write("

" & vbCrLf )

End Sub

%>

<%

end If

%>

<%

if session("admin")="" then

conn.close

set conn = nothing

response.Write ""

response.End

else

javascript常用代码大全

Javascript常用代码大全 //打开模式对话框 //返回模式对话框的值 function okbtn_onclick() { var commstr=''; window.returnValue=commstr; window.close() ; } okbtn_onclick() //全屏幕打开IE 窗口 var winWidth=screen.availWidth ; var winHeight=screen.availHeight-20; window.open("main.aspx","surveyWindow","toolbar=no,wid th="+ winWidth +",height="+ winHeight +",top=0,left=0,scrollbars=yes,resizable=yes,center:yes,statu sbars=yes"); //脚本中中使用xml function initialize() { var xmlDoc var xslDoc xmlDoc = new ActiveXObject('Microsoft.XMLDOM') xmlDoc.async = false; xslDoc = new ActiveXObject('Microsoft.XMLDOM') xslDoc.async = false; xmlDoc.load("tree.xml") xslDoc.load("tree.xsl") folderTree.innerHTML = xmlDoc.documentElement.transformNode(xslDoc) } 一、验证类 1、数字验证内 1.1 整数 1.2 大于0的整数(用于传来的ID的验证) 1.3 负整数的验证 1.4 整数不能大于iMax 1.5 整数不能小于iMin 2、时间类 2.1 短时间,形如(13:04:06) 2.2 短日期,形如(2003-12-05) 2.3 长时间,形如(2003-12-05 13:04:06) 2.4 只有年和月。形如(2003-05,或者2003-5) 2.5 只有小时和分钟,形如(12:03) 3、表单类 3.1 所有的表单的值都不能为空 3.2 多行文本框的值不能为空。 3.3 多行文本框的值不能超过sMaxStrleng 3.4 多行文本框的值不能少于sMixStrleng 3.5 判断单选框是否选择。 3.6 判断复选框是否选择. 3.7 复选框的全选,多选,全不选,反选 3.8 文件上传过程中判断文件类型 4、字符类 4.1 判断字符全部由a-Z或者是A-Z的字字母组成 4.2 判断字符由字母和数字组成。 4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母 4.4 字符串替换函数.Replace(); 5、浏览器类 5.1 判断浏览器的类型 5.2 判断ie的版本 5.3 判断客户端的分辨率 6、结合类 6.1 email的判断。 6.2 手机号码的验证 6.3 身份证的验证 二、功能类 1、时间与相关控件类 1.1 日历 1.2 时间控件 1.3 万年历 1.4 显示动态显示时钟效果(文本,如OA中时间) 1.5 显示动态显示时钟效果(图像,像手表) 2、表单类 2.1 自动生成表单 2.2 动态添加,修改,删除下拉框中的元素 2.3 可以输入内容的下拉框 2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送) 3、打印类 3.1 打印控件 4、事件类 4.1 屏蔽右键 4.2 屏蔽所有功能键 4.3 --> 和<-- F5 F11,F9,F1 4.4 屏蔽组合键ctrl+N 5、网页设计类 5.1 连续滚动的文字,图片

用ASP连接数据库的几种方法

用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文件在同一目录下,你只要这样写就可以了:

JavaScript 经典代码大全

代码一 1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键

no
可用于Table 2. 取消选取、防止复制 3. onpaste="return false" 不准粘贴 4. oncopy="return false;" oncut="return false;" 防止复制 5. IE地址栏前换成自己的图标 6. 可以在收藏夹中显示出你的图标 7. 关闭输入法 8. 永远都会带着框架 9. 防止被人frame 10. 网页将不能被另存为 11. 12.删除时确认 删除 13. 取得控件的绝对位置 //javascript //VBScript