ASP分页方法集合

asp分页功能实现 set rs=server.CreateObject("ADODB.recordset")rs.Open "select * from webdiy_mb ",conn,1,3if rs.bof and rs.eof then response.Write("没有模板") else 定义分页 rs.PageSize=10每页显示的记录数 total_page=rs. 阅读详情

<!--#include file="conn.asp" -->

<%
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from cnarticle"
rs.Open sql,conn,1,1
%>

<%filepath=request.servervariables("path_info")%>
<%
page=request.querystring("page") 'page值为接受值
rs.PageSize = 2 '每页显示记录数
if Not IsEmpty(page) then '如果page已经初始化...
if Not IsNumeric(page) then '判断page值是否为数字
page=1
else
Page = cint(page) '接收page并化为数字型赋给page变量
end if
if Page > rs.PageCount then '如果接收的页数大于总页数
rs.AbsolutePage = rs.PageCount '设置当前显示页等于最后页
elseif Page <= 0 then '如果page小于等于0
rs.AbsolutePage = 1 '设置当前显示页等于第一页
else
rs.AbsolutePage = Page '如果大于零,显示当前页等于接收的页数
end if
else
rs.AbsolutePage=1
end if
Page = rs.AbsolutePage%>

<%
For i = 1 to rs.PageSize '利用for next 循环依次读出当前页的记录
if rs.EOF then
Exit For
end if
response.write("文章标题是:"& rs("cn_title"))
response.write("<br>文章作者是:"& rs("cn_author"))
response.write("<br>文章加入时间是:"& rs("cn_time"))
response.write("<br>文章内容是:"& rs("cn_content"))
response.write("<hr>")
rs.MoveNext
Next
%>

<form action="<%=filepath%>" method="get">
<!--首先保证总页数不为1、不为0-->
<%if rs.pagecount<>1 and rs.pagecount<>0 then%>
<!--如果当前页数大于1,无论何时都应显示首页和上一页的连接-->
<%if page>1 then%>
[<a Href="<%=filepath%>?Page=<% = 1%>">首页</a>]
[<a Href="<%=filepath%>?Page=<% = page -1 %>">上一页</a>]
<!--如果当前页数大于1并且小于总页面数时,显示出尾页和下一页的连接-->
<%if page<rs.pagecount then %>
[<a Href="<%=filepath%>?Page=<% = page + 1%>">下一页</a>]
[<a Href="<%=filepath%>?Page=<% = rs.PageCount%>">尾页</a>]
<!--如果当前页数大于1并且仍大于或等于总页面数时,不显示出尾页和下一页的连接-->
<%else%>
[下一页] [尾页]
<%end if%>
<!--否则,当前页数不大于1,则只显示尾页和下一页的连接-->
<%else%>
[首页] [上一页]
[<a Href="<%=filepath%>?Page=<% = page + 1%>">下一页</a>]
[<a Href="<%=filepath%>?Page=<% = rs.PageCount%>">尾页</a>]
<%end if %>
<!--最终,总页数若为1、为0则没有任何连接-->
<%else%>
[首页] [上一页] [下一页] [尾页]
<%end if%>

[页次:<font color=red><b><%=page%></b></font>/<%=rs.PageCount%>]
[共<%=rs.RecordCount%>篇 <font color=red><b><%=rs.PageSize%></b></font>篇/页]
转到<input name="page" size=5 value="<%=page%>">页
<input type="submit" value="Enter">
</form>

<%
rs.close
Set rs = Nothing
conn.close
set conn=Nothing
%>

长长的分页代码,搞懂是真不容易,平台引用起来还需要修改也是比较麻烦。最后能做成一个函数,下次调用起来就很方便了。


<%
function pagination(pagecount,pagesize,page,resultcount)
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("<form method=get onsubmit=""document.location = '" & action & "?" & temp & "Page='+this.page.value;return false;"">")
if page<=1 then
Response.Write ("[首页] [上一页] ")
else
Response.Write("[<a href=" & action & "?" & temp & "Page=1>首页</a>] ")
Response.Write("[<a href=" & action & "?" & temp & "Page=" & (Page-1) & ">上一页</a>] ")
end if

if page>=pagecount then
Response.Write ("[下一页] [尾页]")
else
Response.Write("[<a href=" & action & "?" & temp & "Page=" & (Page+1) & ">下一页</a>] ")
Response.Write("[<a href=" & action & "?" & temp & "Page=" & pagecount & ">尾页</a>]")
end if
Response.Write("[页次:<font color=red>" & page & "</font>/" & pageCount)
Response.Write("] [共" & resultcount & "条 <font color=red>"& pagesize & "</font>条/页]")
Response.Write(" 转到" & "<input name=page size=4 value=" & page & ">" & "页<input type=submit value=go>")
End function
%>


如要引用,则可以:
<%call pagination(rs.PageCount,rs.pagesize,cint(page),rs.RecordCount) %>

前面的代码是
dim page
rs.pagesize=10
if request.querystring("page")=0 or request.querystring("page")="" then
page=1
else
page=request.querystring("page")
rs.absolutepage=trim(request.querystring("page"))
end if

怎么样把最后一个文本框换成列表表单?

Response.Write("转到<select name=page>")
for i = 1 to pagecount
Response.Write("<option value="&i&">")
next
Response.Write("</select>")

 

一种理论上最快的Web数据库分页方法

  上篇我们谈到了关于数据库传统的三种分页方法和他们的利弊,并且提出了一种理论上最佳的分页方法,本篇我们就来详细说说这种最佳的分页方法。

一:构思。
  在设计Web数据库时,如果我们要编历每一条纪录,那么只有采取分页模式才可以使Web数据库尽快,尽好的呈现给终端用户,也不会因为8秒原则而使用户失去浏览该页的兴趣。但是即使采取分页的办法,当出现多纪录的数据库时,也难免会使我们的用户感到翻页时速度太慢。就如同我的上篇文章说的那样,几乎上一片文章的三种分页方法都有一些缺陷。那么,我们如何做到能让数据库每次就取我们需要的纪录,这个很好实现,有游标返回多个纪录集就可以实现,但是如果让数据库的一端不会因为要刚好检索一页的纪录而大耗资源就很难了。最后,经过我的不断改写程序与测试,终于编写出了我认为理论上最快的Web数据库分页方法。

二:具体实现的存储过程。
  我们结合一个BBS问题来谈谈这种方法。如何让一个BBS每次每页只现实需要的一页纪录呢?而我们需要提供给数据库有那些参数呢?可能会有以下参数。
  第一:就是我们需要的当前的页数。
  第二:当前定义的每一页的纪录集数目。这样你就可以根据需要在页面程序中修改每一页的纪录数。当然,如果你不考虑程序的可扩展性,你也可以在数据库里直接规定每一页有N条纪录即可。
  第三:一个输出参数:就是从数据库里得出当前表中总纪录数目的多少。(注意,他不是一个页的纪录数目)他相当于ADO分页法中的Recordcount。如果你不需要总纪录数目可以不用返回他。
  我们来看具体存储过程的代码。。。

CREATE PROCEDURE dbo.PRO_pageview
(

@tint_tableid tinyint=1,   --这个是BBS的当前版面Id,你可以不用管他。。
@int_pagenow int=0,      
@int_pagesize int=0,
@int_recordcount int=0 output  --就是得出BBS某个版面的总贴数。。

)

AS
set nocount on

declare @int_allid int    
declare @int_beginid int,@int_endid int 
declare @int_pagebegin int, @int_pageend int
  
select @int_allid=count(*) from tab_discuss where tint_level=0 and tint_tableid=@tint_tableid
  select @int_recordcount=@int_allid     --得出该版面的总贴数
      
  declare cro_fastread cursor scroll
  for  select int_id from tab_discuss where tint_level=0 and tint_tableid=@tint_tableid order by int_id desc --这里定义游标操作,但是不用临时纪录集,而且游标也不需要全部遍历所有纪录集。
  
  open cro_fastread --打开游标
  select @int_beginid=(@int_pagenow-1)*@int_pagesize+1 得出该页的第一个纪录Id
  select @int_endid = @int_beginid+@int_pagesize-1   得出该页的最后一个纪录的Id
  
  fetch absolute @int_beginid from cro_fastread into @int_pagebegin 将他的Id传给一个变量该页开始的Id
  if @int_endid>@int_allid    --这里要注意,如果某一页不足固定页数的纪录时。如只有一页纪录,而且纪录少于我们定义的数目。或者是最后一页时。。。
    fetch last from cro_fastread into @int_pageend  --直接将游标绝对定位到最后一条纪录,得出他的id号来。。。
  else
    fetch absolute @int_endid from cro_fastread into @int_pageend
        
  select int_id,tint_level,tint_children,var_face,var_subject,datalength(txt_content) as int_len,sint_hits,var_url,var_image,var_user,dat_time,tint_tableid,bit_kernul from tab_discuss where tint_tableid=@tint_tableid and int_rootid between @int_pageend and @int_pagebegin order by int_rootid desc,num_order desc   --我们就可以利用该页的第一个id和最后一个id得出中间的id来。。。。(注意。我们这个BBS的数性结构用了一种很巧妙的算法,就是用一个orderNum浮点数即可完成排序。。。)

--开始清场。。。
  close cro_fastread     
  deallocate cro_fastread
  
  return


我们再看看Asp页面里的程序操作。。。

pagenow=cint(request("pagenow")) --当前的页面。

if pagenow<=0 then pagenow=1
pagesize=10

set cmd=server.CreateObject("adodb.command")
cmd.ActiveConnection=strconn
cmd.CommandType=4
cmd.CommandText="pro_pageview"

cmd.Parameters.Append cmd.CreateParameter("tint_tableid",adInteger,adParamInput,,tint_tableid)
cmd.Parameters.Append cmd.CreateParameter("int_pagenow",adInteger,adParamInput,,pagenow)
cmd.Parameters.Append cmd.CreateParameter("int_pagesize",adInteger,adParamInput,,pagesize)
cmd.Parameters.Append cmd.CreateParameter("int_recordcount",adInteger,adParamOutput)

set rs=cmd.Execute
if rs.eof then
  Response.Write "目前已超过了纪录个数或纪录集为空!"
  Response.End
end if

dim arrRs
arrRs=rs.getrows   '可以利用getRows将纪录集迅速保存到一个二维的数组中来提高速度。

recordcount=cmd.Parameters("int_recordcount")
'注意,当纪录不足以刚好整除单位页纪录时,我们也要将其定义为一页,如纪录数目为2页多一个纪录,此时我们的页数也要为3页纪录。
if (recordcount mod pagesize)=0 then
  pagecount=recordcount/pagesize
else
  pagecount=recordcount/pagesize+1
end if


<--分页开始 -->
<!-- #include file="include/tablepage.asp" -->固定的分页函数,其实无非是pagenow+1或pagenow-1,pagenow,pagecount
<!--分页结束-->


<div align="left" class="pblank" >
<%
'---------显示树性结构!-------------
level=0
Response.Write "<ul>"
for i=0 to ubound(arrRs,2)
  if arrRs(1,i)>level then
    Response.Write "<ul>"
  end if
  if arrRs(1,i)<level then
    for j=arrRs(1,i) to level-1
        Response.Write "</ul>"
    next
  end if
  int_size=arrRs(5,i)
  if int_size=0 then
    str_size=" <无内容>"
  else
    str_size=""
  end if
  Response.Write "<li><img src=face/"&arrRs(3,i)&"><a href=showTitle.asp?int_id="&arrRs(0,i)&"&tint_tableid="&tint_tableid&" class=ptitle target=BoardAnnounce>"&server.HTMLEncode(arrRs(4,i))&"</a> "&str_size
  if arrRs(7,i)<>"" then Response.Write " <连接> "
  if arrRs(8,i)<>"" then Response.Write " <图像> "
  Response.Write "   -【"&arrRs(9,i)&"】 <font color=444444>"&arrRs(10,i)&"</font> [<font color=920092>ID:"&arrRs(0,i)&" 点击:"&arrRs(6,i)&"次</font>] <font color=444444>("&int_size&"字节)</font> <font color=ff0000>("&arrRs(2,i)&")</font></li>"
  
  
  level=arrRs(1,i)
  
next

Response.Write "</ul>"
'---------显示树性结构完毕!-------------

%>
</div>
<div align="left">
<!--分页开始 -->
<!-- #include file="include/tablepage.asp" -->
<!--分页结束-->
</div>
<!-- 清场与除错 -->
<%
rs.close
set rs=nothing
set cmd=nothing
if err.number<>0 then Response.Redirect "bug.asp"
%>

三:特点
  我们来看看他和传统的三种方法的区别与特点
  第一:每次只传回一页纪录,而且只形成一个纪录集,而且客户端可以采用速度最快的火线游标来完成页面输出。而不必像传统的游标法用rs.nextrecordset纪录来输出纪录。
  第二:数据库没有用到临时表,这样比转储纪录集的速度大大提高。
  第三:采用一个滚动游标,而且游标只经过二个操作就完成定位。速度也大大提高。
  
  当我采用了这种分页方法时,已经可以明显的感觉出分页速度的提高了。当然,在处理树型结构,数据库运算时,我采用了许多方法尽可能的提高速度,如:采用二分区间法来编历树型结构,全部采用存储过程来实现一切sql操作,采用触发器和数据库游标来完成数据库算法,这样就尽量避免过多的网络传输。任何操作只和数据库进行一次参数传递就可以完成。


另一种方法就是
pagesize:每页条数
第n页

select top "&pagesize&" * from 表名 where id not in (select top "&pagesize*(n-1)&" id from 表名 order by id)order by id

id 是primary key



怎么用ASP实现分页(一) 怎么用ASP实现分页(一)dim currentpage 定义当前页dim filename 文件名Const MaxPerPage=20 每页显示的记录个数dim totalnumber 记录总数filename="showpages.asp"totalnumber=200 设置记录总数为200if not isempty(request("page")) thencurrentPag 阅读详情

相关推荐

ASP.Net中Gridview设置分页

GridView分页

weixin_44171249的博客 1463

ASP分页详解

          如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。想不想了解如何实现分页显示?请看本文!  那么究竟如何才能做到将数据库的查询结果分页显示呢?其实方法有很多,但主要有两种:  一、将数据库中所有符合查询条件的记录一次性的都读

我的生活,我的BLOG 1387

ASP.NET中刷新分页

1,第一次全部把数据加载到内存中,然后再做分页,性能差,不推荐。 2,GridView自带分页 3,AspNetPager分页控件 这个是第三分控件需要下载,很好用 4,自己写分页 前三种就不介绍如何写了,网上很多,今天就来记录一下自己写的分页,不需要下载任何东西,全部都是代码完成。 原理则是通过URL来传递参数(第几页,每个多少个,总记录数等),最终生成这样的,每个都是一个超链接,只...

weixin_30895603的博客 122

asp.net mvc 分页控件 MvcPager修改;使用范围增大

其实也没什么,就是记录下来和大家分享下。 做asp.net mvc 2.0 的项目,肯定要用到分页功能了,上网搜了几下。偶然间发现MvcPager分页控件,感觉要用的功能都有了非常喜欢啊。(PS:写这个控件的哥们是个个听力有障碍的残疾人,在此敬佩一下,视早日康复) 于是乎查看了一下使用方法,很简单,如下: 在自己的linq查询集合上.ToPagedList(pageInde...

weixin_30520015的博客 155

ASP.NET 数据绑定详解 代码+步骤

文章目录1. 数据绑定概述2. 简单数据绑定2.1. 属性绑定2.2. 表达式绑定2.3. 集合绑定2.4. 方法绑定3. 数据控件绑定3.1. ListControl 控件3.2. GridView 控件3.2.2. 使用GridView控件绑定数据源3.2.3. 自定义GridView控件的列字段名3.2.4. 使用GridView控件分页显示数据3.3. DataList 控件3.3.1. ...

白水的博客 5607

ASP.NET 数据绑定控件和 Eval方法

数据绑定(很早的时候做的笔记)简单属性 <%# textBox.txt%>Page.DataBind();该方法将数据源绑定到被调用的服务器控件及其所有子控件<asp:TextBox ID=”TextBox1” runat=”server” AutoPostBack=”True” ontextchanged=”TextBo...

ahtzday206576的博客 252

ASP.NET List泛型分页代码

我们以前做ASP.NET网站,通常是把DataSet绑定到显示控件上,再用各种手段进行分页,比如PagedDataSource。然而,如果你是从业务层取数据,通常是一个List,这个时候就不能用以往的方法分页了。 pageControl.ascx / 页 每页   总数    首  页         上一页 下一页&nbs

三江的博客 525

多种分页汇总

1.GridView自带分页。 操作方法:1.用XXDataSource(SqlDataSource、ObjectDataSource随你)绑定。开启分页,OK.不会玩,网上搜 2.给GridView添加个Paging_Change事件。代码也很简单,不会玩,网上搜 2.DataList、Repeat 这两个比较麻烦。因为要取到第几页的内容。其实就是难在数据源的分解。 常...

144

ASP.NET MVC 分页之 局部视图

using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography.X509Certificates; using System.Web; namespace MvcAppPager.Models { public interface...

weixin_34161083的博客 375

使用LINQ 對List分頁/區

listview之類的服務器控件分頁自不用多說,拖拖控件改改屬性分分鐘的事.就不浪費大家時間了. 這裏只寫大概思路及關鍵代碼了. LINQ裏有一個對集合進行分區的操作可用於分頁. pageSize:分頁大小,也就是一頁顯示的行數 curretPage:當前頁碼.先這麼理解吧 totalPages:總頁數 taotalPages=(int)Math.Ceil...

weixin_34337381的博客 72

如何在asp中记录集分页后动态获得控件状态

最近在做asp程序的时候,遇到一个问题。即recordset分页后,显示的时候为每行记录人为增加一个单选按钮以便选中后删除该记录,但当记录数=1或>1时,需要获知控件的个数,以下提供两种解决方法,其中方法2非常好。当记录数>1时,可通过遍历相同name属性的按钮集合来遍历如:当记录数=1时,只判断单个按钮的状态如:解决方法1: function del(frm) {  for(i=0;i 

绚蓝冰蝶的专栏 1094

手把手教你做MVC3中的完美分页控件

先说下思路,再上代码。此教程分三步走:第一步:做一个具有分页属性的数据集合类PagedList<T>,可将数据源传入其中,使数据源具有分页的各个属性。第二步:在Controller中设设置页码等参数(教程中另外包括一个栏目类别的id参数,可根据实际项目将其删除),并用PagedList<T>获取数据。第三步:将获得数据后的PagedList<T>作为M...

weixin_30664051的博客 61

ASP.NET2.0快速入门--高级数据方案(4)

 高级分页/排序GridView 控件中的选择纯粹是一个 UI 概念,其中 SelectedIndex 属性对应于网格的可见行中当前选定的行的索引。如果在网格中启用了分页和排序,网格的 SelectedIndex 将在分页或排序操作之后保持不变,以便在这些操作之后最终将选定新行。在某些情况下,最好保留给定行的选择,即使是在该行目前在网格的当前页上不可见的时候也如此。下面的示例演示一种用于跨

路雪军 Carl 839

Asp.Net从零开始学-18

        简单绑定     private void txtName_TextChanged(object sender, System.EventArgs e)  {   Page.DataBind();//数据绑定的方法  }        集合绑定DataList控件         数字:     平方;     货币;"{0:c}")%>    private void Pag

小晖Allen的专栏 977

GridView 与自定义对象的绑定和分页

一、自定义对象和对象集合 usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;/**////<summary>///手机模块定位///</summary>publicclassBus{publicBus(stringname,floatlongitude,...

weixin_30539625的博客 82

datalist 分页

<br />private const int PAGECOUNT = 9;<br />    private static int nPhotoCount = 0;<br />    private int nPhotoAllPageCount = 0;<br />    private int nPhotoCurrentPage = 0; <br />    protected void Page_Load(object sender, EventArgs e)<br />    {<br />    

hebiaccpguo的专栏 336

(菜鸟要飞系列)五,基于Asp.Net MVC5的后台管理系统(添加数据表的分页功能)...

献上代码 1 public ActionResult SelectAll(int id=1) 2 { 3 4 List<UserModel> arrayUserModel = new List<UserModel>(); 5 string strText = R...

weixin_30532759的博客 159
上一篇: 使用 ASP.NET 2.0 ObjectDataSource 控件
下一篇: 创建存储过程并设置自动执行
liusylon
博客等级 码龄23年 3粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值