注册 登录
编程论坛 ASP技术论坛

大量记录快速分页代码,SQL语句分页

zhangyao3287 发布于 2008-06-06 09:00, 2507 次点击
<%
Cardnumber = Conn.Execute("select count(*) as counts from [List_view]")("counts")
vPage = Cint(Request.QueryString("Page"))
vPageSize = 50
If Cardnumber mod vPageSize > 0 Then
vPgnum = Cint(Fix(Cardnumber/vPageSize) + 1)
Else
vPgnum = Cint(Cardnumber/vPageSize)
End If
If vPage = "" Or vPage < 1 Then vPage = 1
If vPage > vPgnum Then vPage = vPgnum
vPagecount = vPageSize*(vPage-1)
Set vRs = Server.CreateObject("ADODB.Recordset")
If vPage = 1 Then
Sql = "select top "&vPageSize&" id from [List_view] order by id"
Else
Sql = "select top "&vPageSize&" id from [List_view] where (id not in (select top "&vPagecount&" id from [List_view] order by id)) order by id"
End If
vRs.Open Sql,conn,1,1
  If vRs.Eof Then
    Response.Write("暂无数据~~~")
  Else
    Do While Not vRs.Eof
    Response.Write(""&vRs("id")&"<br />")
    vRs.MoveNext
    Loop
    vRs.close:Set vRs = Nothing
  End If

'---------------------分页开始------------------------
If Cardnumber > vPageSize Then

Response.Write "          <div id=""Main_ShowPage"">" & Chr(13)
if AllPage > vPgnum then
    AllPage = vPgnum
end if
   
if vPage - FrontPage < 1 then
    Start = 1
    sEnd = AllPage
elseif vPage + AllPage - FrontPage > vPgnum  then
    Start = vPgnum - AllPage + 1
    sEnd = vPgnum
else
    Start = vPage - FrontPage
    sEnd = vPage - FrontPage + AllPage - 1
end if

for i = Start to sEnd
if i = 1 then
    Url = "1"
else
    Url = i
end if
    if i = vPage then
        vPages = vPages & "<font color=""#ff0000""><b>["&i&"]</b></font> "
    else
        vPages = vPages & "<a href=""?Page="&Url&""">["&i&"]</a> "
    end if   
next

if vPage = 1 then
    Fpage = "首页"
    Lpage = "上一页"
else
    Fpage = "<a  href=""?Page=1"">首页</a>"
    Lpage = "<a  href=""?Page="&vPage - 1&""">上一页</a>"
end if

if vPage = vPgnum then
    Npage = "下一页"
    Rpage = "尾页"
else
    Npage = "<a  href=""?Page="&vPage + 1&""">下一页</a>"
    Rpage = "<a  href=""?Page="&vPgnum&""">尾页</a>"
end if

Response.Write "共"&Cardnumber&"条记录  页次:"&vPage&"/"&vPgnum&"页  "&Fpage&"  "&Lpage&"  "&vPages&"  "&Npage&"  "&Rpage&"  "
Response.Write "<select name=""page"" onChange=javascript:location.href=""?Page=""+document.all.page.options[document.all.page.selectedIndex].value+"""" size=""1"">"
for i = 1 to vPgnum
Response.Write "    <option value="""&i&""" "
if vPage = i then Response.Write "selected"
Response.Write ">第"&i&"页</option>"
next
Response.Write "</select>"
Response.Write "          </div>" & Chr(13)

End If
'---------------------分页结束------------------------
%>

[[it] 本帖最后由 zhangyao3287 于 2008-6-6 11:14 编辑 [/it]]
15 回复
#2
zhangyao32872008-06-06 09:39
没人给点意见吗?好歹我也打了好半天啊,郁闷了
#3
zhangjianghan2008-06-06 10:02
顶!!!!!
楼主,我把你的代码拿来试一下,数据库字段都已改成我数据库表的,但出现“ODBC 驱动程序不支持所需的属性”这种情况,怎么回事呢,是不是还要改什么?
#4
zhangyao32872008-06-06 10:04
错误出在第几行呢?
Response.Write SQL
Response.End()
#5
zhangjianghan2008-06-06 10:14
楼主在线呀  你好!
/web/小组信息/oo.asp,行 11  vRs.Open Sql,conn,1,1
#6
zhangyao32872008-06-06 10:20
Response.Write SQL
Response.End()
然后把SQL放在查询分析器里运行一下
你用的是什么数据库啊?
这样测试一下
If vPage = 1 Then
Sql = "select top "&vPageSize&" id from [List_view] order by id"
Else
Sql = "select top "&vPageSize&" id from [List_view] where (id not in (select top "&vPagecount&" id from [List_view] order by id)) order by id"
End If
#7
zhangjianghan2008-06-06 10:22
我用的是acc数据库
#8
zhangjianghan2008-06-06 10:26
<!-- #include file="date.asp" -->
<table>
<%
Cardnumber = Conn.Execute("select count(*) as counts from teacher")("counts")
vPage = Request.QueryString("Page")
If vPage = "" Or Clng(vPage) < 1 Then vPage = 1
vPageSize =9
vPagecount = vPageSize*(vPage-1)
Set vRs = Server.CreateObject("ADODB.Recordset")
Sql = "select top "&vPageSize&" tid from teacher where (tid not in (select top "&vPagecount&" tid from teacher order by tid)) order by tid"
vRs.Open Sql,conn,1,1
  If vRs.Eof Then
    Response.Write("暂无数据~~~")
  Else
    Do While Not vRs.Eof%>
            <tr>
      <td width="100"><%=vRs("suser")%></td>
      <td width="100"><%=vRs("sxh")%></td>
       <td width="100"><%=vRs("sname")%></td>
      <td width="100"><%=vRs("ssex")%></td>
       <td width="100"><%=vRs("jmobile")%></td>
       </tr>
   <% vRs.MoveNext
    Loop
    vRs.close:Set vRs = Nothing
  End If

'---------------------分页开始------------------------
If Cardnumber > vPageSize Then

Response.Write "          <div id=""Main_ShowPage"">" & Chr(13)
if AllPage > vPgnum then
    AllPage = vPgnum
end if
   
if vPage - FrontPage < 1 then
    Start = 1
    sEnd = AllPage
elseif vPage + AllPage - FrontPage > vPgnum  then
    Start = vPgnum - AllPage + 1
    sEnd = vPgnum
else
    Start = vPage - FrontPage
    sEnd = vPage - FrontPage + AllPage - 1
end if

for i = Start to sEnd
if i = 1 then
    Url = "1"
else
    Url = i
end if
    if i = vPage then
        vPages = vPages & "<font color=""#ff0000""><b>["&i&"]</b></font> "
    else
        vPages = vPages & "<a href=""?Page="&Url&""">["&i&"]</a> "
    end if   
next

if vPage = 1 then
    Fpage = "首页"
    Lpage = "上一页"
else
    Fpage = "<a  href=""?Page=1"">首页</a>"
    Lpage = "<a  href=""?Page="&vPage - 1&""">上一页</a>"
end if

if vPage = vPgnum then
    Npage = "下一页"
    Rpage = "尾页"
else
    Npage = "<a  href=""?Page="&vPage + 1&""">下一页</a>"
    Rpage = "<a  href=""?Page="&vPgnum&""">尾页</a>"
end if

Response.Write "共"&Cardnumber&"条记录  页次:"&vPage&"/"&vPgnum&"页  "&Fpage&"  "&Lpage&"  "&vPages&"  "&Npage&"  "&Rpage&"  "
Response.Write "<select name=""page"" onChange=javascript:location.href=""?Page=""+document.all.page.options[document.all.page.selectedIndex].value+"""" size=""1"">"
for i = 1 to vPgnum
Response.Write "    <option value="""&i&""" "
if vPage = i then Response.Write "selected"
Response.Write ">第"&i&"页</option>"
next
Response.Write "</select>"
Response.Write "          </div>" & Chr(13)

End If
'---------------------分页结束------------------------
%>
</table>

这是我改以后的代码 ,你看看!!1
#9
zhangyao32872008-06-06 10:32
access数据查询不支持 select top 0 * from
所以当vPage=1的时候多写一个SQL语句就可以了

If vPage = 1 Then
Sql = "select top "&vPageSize&" id from [List_view] order by id"
Else
Sql = "select top "&vPageSize&" id from [List_view] where (id not in (select top "&vPagecount&" id from [List_view] order by id)) order by id"
End If
#10
zhangjianghan2008-06-06 11:01
If Cardnumber > vPageSize Then

Response.Write "          <div id=""Main_ShowPage"">" & Chr(13)
if AllPage > vPgnum then
    AllPage = vPgnum
end if
   
if vPage - FrontPage < 1 then
    Start = 1
    sEnd = AllPage
elseif vPage + AllPage - FrontPage > vPgnum  then
    Start = vPgnum - AllPage + 1
    sEnd = vPgnum
else
    Start = vPage - FrontPage
    sEnd = vPage - FrontPage + AllPage - 1
end if

for i = Start to sEnd
if i = 1 then
    Url = "1"
else
    Url = i
end if
    if i = vPage then
        vPages = vPages & "<font color=""#ff0000""><b>["&i&"]</b></font> "
    else
        vPages = vPages & "<a href=oo.asp?Page="&Url&""">["&i&"]</a> "
    end if   
next

if vPage = 1 then
    Fpage = "首页"
    Lpage = "上一页"
else
    Fpage = "<a  href=oo.asp?Page=1"">首页</a>"
    Lpage = "<a  href=oo.asp?Page="&vPage - 1&""">上一页</a>"
end if

if vPage = vPgnum then
    Npage = "下一页"
    Rpage = "尾页"
else
    Npage = "<a  href=oo.asp?Page="&vPage + 1&""">下一页</a>"
    Rpage = "<a  href=oo.asp?Page="&vPgnum&""">尾页</a>"
end if

Response.Write "共"&Cardnumber&"条记录  页次:"&vPage&"/"&vPgnum&"页  "&Fpage&"  "&Lpage&"  "&vPages&"  "&Npage&"  "&Rpage&"  "
Response.Write "<select name=""page"" onChange=javascript:location.href=oo.asp?Page=""+document.all.page.options[document.all.page.selectedIndex].value+"""" size=""1"">"
for i = 1 to vPgnum
Response.Write "    <option value="""&i&""" "
if vPage = i then Response.Write "selected"
Response.Write ">第"&i&"页</option>"
next
Response.Write "</select>"
Response.Write "          </div>" & Chr(13)

End If

楼主应该怎么改,已经显示出来,但没出现下拉框,点击下一页就出错,这个页面是oo.asp
#11
zhangyao32872008-06-06 11:14
现在OK了,1楼代码修改之后了,测试过了,嘿嘿
#12
zhangyao32872008-06-06 11:16
共54657条记录 页次:21/1094页 速度非常快
#13
zhangjianghan2008-06-06 11:24
楼主帮忙改一下分页那块地方,我本页名称是oo.asp,不出现下拉框,点击下一页出错
#14
zhangjianghan2008-06-06 11:26
楼主有QQ吗  我的QQ278371504,加我,有点问题问你
#15
zhangyao32872008-06-06 11:29
你用的是我1楼重新改过的代码么?
#16
天涯听雨2008-06-06 13:04
其实你这方法也是不错的。利用两次排序方法把所需要的记录进行TOPB出来。

但是你的还是可以进行改进的。因为在效率方面:in 的效率是最低。在写SQL语句时,我们有一原则,能不用就尽量不用。

上面的代码,如果你能确定排序是主键的话,完成是可以通过where 中的 < 或>来进行写代码,这个效率会比 in 高很多。

但如果不是主键排序的话,上面的方法应该算是最好方法。
1