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

[原创]刚才做了半天完成的简易分页类

yms123 发布于 2005-12-09 22:33, 26502 次点击

只有本站会员才能查看附件,请 登录

经过我的不懈努力,这个分页类终于被我完善完成,以更新为改进版,解决了最后一页的页码问题。经测试基本上无论如何设置每页的记录数,翻页都不会出错。

[此贴子已经被作者于2005-12-10 17:02:32编辑过]

123 回复
#2
yms1232005-12-09 22:45
回复:(yms123)[原创]刚才做了半天完成的简易分页类...
只有本站会员才能查看附件,请 登录

这个是分页类的分页效果。
#3
caiyakang2005-12-09 23:32
不错,顶一下。
老大,帮我看看,我那个问题
#4
yms1232005-12-10 17:05
晕,努力了半天没人回帖,起码应该对得起别人的劳动吧?
#5
caiyakang2005-12-10 18:03
我帮你顶一下!回去好好研究
#6
dreame2005-12-10 18:48

我也是哦,老大

#7
yaoqilove2005-12-10 20:32

支持!对我们初学的好处多多!辛苦了!希望以后有更多的这样的程序可以学习!加油!

#8
griefforyou2005-12-10 21:22
PagingControl 函数里的逻辑太复杂,IF语句一大把,应该可以简化吧。
#9
ming2062005-12-10 21:28
鼓励,偶下下来研究一下下,哈哈!
#10
yms1232005-12-10 21:39
以下是引用griefforyou在2005-12-10 21:22:00的发言:
PagingControl 函数里的逻辑太复杂,IF语句一大把,应该可以简化吧。

的确,代码的确是有精简的余地的。那个函数的作用就是主要控制分页的页码,和页数循环,而且一些算法还是可以精简的。目前这个只能算是简易的分页类,不过改进一下的话就应该可以做出一些复杂的功能。

#11
maxianfong2005-12-20 23:23
<%
'页面主体循环部分(该部分也可以用户自己用以定义的rs对象来循环或者用本类提供的方法循环)
' Dim FHtml'设定每条记录显示的Html代码(需要动态显示纪录的部分用{字段名}的方式来书写)
FHtml="<tr>"
FHtml=FHtml&"<td width=74 height=16 valign=top><div align=center class=style1>{ID}</div></td>"
FHtml=FHtml&"<td width=96 valign=top><div align=center class=style1>{名字}</div></td>"
FHtml=FHtml&"<td width=142 valign=top><div align=center class=style1>{地址}</div></td>"
FHtml=FHtml&"<td width=135 valign=top><div align=center class=style1>{住宅电话}</div></td>"
FHtml=FHtml&"<td width=152 valign=top><div align=center class=style1>{生日}</div></td>"
FHtml=FHtml&"</tr>"
Response.Write oPage.BodyCyclicTransformation(rsTest,FHtml)'叶面主体循环代码
%>



这么多东西是什么意思呀~~



为什么不用 rs 来做呢?~~ 有点不明白~~

do while not rsTest.eof
。。。。。。。。。。。。。。。

rsTest.MoveNext
Loop

不知道可不可以这样子做~`

#12
maxianfong2005-12-20 23:25

本人到是有一个还可以~ 不过就是最后一面显示时,有错误

是这样子显示的
9 1 2 3 4 5 6 7 8 9 10 8 : 共有记录10931页/共137 第一页 前一页 下一页


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>

<body>
<% '=============打开数据库表,要以这种方式打开
set rs=server.CreateObject("adodb.recordset")
rs.open "select * from jjzh where flag=1 order by id desc",conn,1,1
%>
<%'=============分页定义开始,要放在数据库打开之后
rs.PageSize=10 '定义每页记录数,可根据实际自定义
PageNo=REQUEST("Page")
recordcount=rs.recordcount
if PageNo="" or PageNo=0 then PageNo=1
RS.AbsolutePage=PageNo
TSum=rs.pagecount
RowCount=rs.PageSize
PageNo=PageNo+1
PageNo=PageNo-1
if CINT(PageNo)>1 then
if CINT(PageNo)>CINT(TSum) then
response.Write("对不起没有您想要的页数")
Response.End
end if
end if
if PageNo<0 then
response.Write("没有这一页!")
Response.End
End if
'=============分页定义结束%>
<%'===========循环体开始
do while iPage<rs.PageSize%>
<table width="559" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="559">
<% title=rs("mr")
if len(title)>100 then title=left(title,98)+"..."
response.write title %>
<a href="gqxx_sk.asp?id=<%=rs("id")%>&fenlei=<%=session("qq")%>">[查看详细信息]</a></td>
</tr>
</table>
<table width="559" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="559"> </td>
</tr>
</table>
<%
rs.movenext
iPage=iPage+1
loop
rs.close '释放资源
set rs=nothing
'===========循环体结束%>
<%'===========过程调用,要放在数据库打开后、释放资源前
call listPages()%>
<%'==========分页过程开始,也可单独创建一文件在本文件前包含调用
sub listPages() '定义过程开始%>
<TABLE width=100% height="5" border=0 align=center cellPadding=3 cellSpacing=0>
<TBODY>
<TR>
<TD width=100% align=center bgcolor="#EEEEEE" style="LETTER-SPACING: 1px">
<%if TSum>10 then
if PageNo mod 10=0 then
currid=PageNo
currid1=PageNo-9
else
if TSum mod 10=0 then
currid=int(PageNo/10)*10+10
else
if int(PageNo/10)=int(TSum/10) then currid=(TSum/10)*10 else currid=int(PageNo/10)*10+10
end if
currid1=int(PageNo/10)*10+1
end if
else
currid=TSum mod 10
currid1=int(TSum/10)*10+1
end if%>
<FONT
face=webdings>
<%if PageNo=1 then%>
<span style="color: #FF0000">9</span>
<%else%>
<a href=<%=request.ServerVariables("script_name")%>?Page=1&fenlei=<% =trim(request("fenlei")) %> title="首页">9</a>
<%end if%>
<%if PageNo>10 then%>
<a href=<%=request.ServerVariables("script_name")%>?Page=<%=currid1-1%>&fenlei=<% =trim(request("fenlei")) %> title="前10页">7</a>
<%end if%>
</FONT><strong>
<%
for i=currid1 to currid
if PageNo=i then
response.Write("<font color=red>"&i&"</font>")
else%>
<a href=<%=request.ServerVariables("script_name")%>?Page=<%=i%>&fenlei=<% =trim(request("fenlei")) %>>
<%response.write i%>
</a>
<%end if%>
<%response.write " "%>
<%next%>
</strong><FONT
face=webdings>
<%if currid<TSum then%>
<a href=<%=request.ServerVariables("script_name")%>?Page=<%=currid+1%>&fenlei=<% =trim(request("fenlei")) %> title="后10页">8</a>
<%end if%>
</FONT> <FONT
face=webdings>
<%if PageNo=TSum then%>
<span style="color: #FF0000">:</span>
<%else%>
<a href=<%=request.ServerVariables("script_name")%>?Page=<%=TSum%>&fenlei=<% =trim(request("fenlei")) %> title="尾页">:</a>
<%end if%>
</FONT>共有记录<font color="#FF0000"><%=recordcount%></font>第<font color="#FF0000"><%=PageNo%></font>页/共<font color="#FF0000"><%=TSum%></font>页<a href=<%=request.ServerVariables("script_name")%>?Page=1>
<%If pagecount<>1 Then
Response.Write "<a href="&request.ServerVariables("script_name")&"?Page=1&fenlei="&trim(request("fenlei"))&">"
End If%>
第一页</a>
<%If pagecount<>1 Then
Response.Write "<a href="&request.ServerVariables("script_name")&"?Page="&(PageNo-1)&"&fenlei="&trim(request("fenlei"))&">"
End If%>
前一页
<%If pagecount<>TSum Then
Response.Write "<a href="&request.ServerVariables("script_name")&"?Page="&(PageNo+1)&"&fenlei="&trim(request("fenlei"))&">"
End If %>
下一页</TD>
</TR>
</TBODY>
</TABLE>
<%
end sub '定义过程结束
'==========分页过程结束%>
</body>
</html>

[此贴子已经被作者于2005-12-20 23:30:54编辑过]

#13
dzt00012005-12-20 23:29
#14
maxianfong2005-12-20 23:32
不好的一点就是

到最后一页时就是报错~ 大家帮看一下呀~~



ADODB.Field 错误 '80020009'

BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。

/qydq_xb.asp,行 0

#15
iamliubo2005-12-20 23:37
强烈谢谢
#16
yms1232005-12-22 23:28
以下是引用maxianfong在2005-12-20 23:32:00的发言:
不好的一点就是

到最后一页时就是报错~ 大家帮看一下呀~~



ADODB.Field 错误 '80020009'

BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。

/qydq_xb.asp,行 0

不可能呀,我已经改进过了。并经过试验最后一页是不会出错的,虽说算法上还是复杂了一些,但已经经过我的测试没有任何问题。里面的例子程序就是可以用来验证。

#17
t_xiang2005-12-23 11:35
我是菜鸟

友情帮顶!

#18
ziyan2005-12-23 13:54

谢谢楼主

#19
long002006-04-10 21:32
如果我要查看名字里的信息怎么样加一个链接呀,谢谢回答呢 !!
#20
wangjn1232006-04-10 21:41
收了
谢谢!!
#21
yms1232006-04-10 22:35
回复:(long00)如果我要查看名字里的信息怎么样加一...
以下是引用long00在2006-4-10 21:32:00的发言:
如果我要查看名字里的信息怎么样加一个链接呀,谢谢回答呢 !!

如果是网页加参数传参可以用。

oPage.URLStr="admin_UsLevelSeting.asp?Prem=参数1&Prem=参数2&"
的方法改变连接的URL传参数。
如果是SQL语句查询可以用
oPage.SQLStr="select * From Table Where TName='"&Request("Name")&"'"
改变这个字符串就可以改变SQL查询结果。
循环体有两种循环办法
一种使用
我写的那个循环方法,比较简单。
如果这种方法太简单无法满足要求,还可以用第二种直接用rs对象进行循环都可以。

Dim nPage
For nPage=0 To rs.PageSize
'这里加上页面记录的循环代码就OK了。
IF rs.EOF Then
rs.MoveNext
End IF
Next

#22
atozxp2006-04-10 23:54

为什么第11页只显示共11页 当前第11页 9 710 8:,而不显示11俩字呢?

我向你的数据库里又插入了一些记录(都显示在第1-2页了),分页已经达到了13页,但就是第13这俩字依然不显示。

[此贴子已经被作者于2006-4-11 0:02:10编辑过]

#23
yms1232006-04-10 23:59
以下是引用atozxp在2006-4-10 23:54:00的发言:
为什么第11页只显示共11页 当前第11页 9 710 8:,而不显示11俩字呢?

这里可能有点BUG最后一页可能循环没有循环出来,因为为了防止页数达到顶峰一般最后循环都是总页数-1的算法。
这点我回头改进一下。

#24
yms1232006-04-11 00:03
不过直接点击最后一页同样可以到达最后一页,并且可以向前翻页。
如果说新插入的数据显示在第1-2页这个是数据库没有对ID排序,设置一下access数据库的主键排序即可。这个不是程序的BUG,因为排序方法各有不同,这个跟不同的数据库设置有关所以程序并不提供排序功能。

[此贴子已经被作者于2006-4-11 0:12:40编辑过]

#25
雨下的时候2006-06-19 04:02

页码:
<%
'------用qtemp保存传递的搜索变量(不用管这个变量,可去掉)-----------------
pageno=request("pageno")
if pageno="" then pageno=1


'------------------------------------------------------------
if pageno mod 10<>0 then '起始页,例如:15的起始页为11
qbegin=pageno-(pageno mod 10)+1
else
qbegin=pageno-9
end if
i=qbegin
if qbegin<>1 then
response.write "[<a href=""?pageno=1"&qtemp&""">第一页</a>]"
response.write "[<a href=""?pageno="&(qbegin-10)&qtemp&""">前10页</a>]&nbsp;"
end if
do while (i<=rs.pagecount) and (i<(qbegin+10))
if i=cint(pageno) then
response.write "[<font color=""ff0000"">"&i&"</font>]"
else
response.write "[<a href=""?pageno="&i&qtemp&""">"&i&"</a>]"
end if
i=i+1
loop
if i<=rs.pagecount then '如果当前页在最后一批10页中,就不显示“后10页”和“最后一页”这两个连接了
response.write "&nbsp;[<a href=""?pageno="&(qbegin+10)&qtemp&""">后10页</a>]"
response.write "[<a href=""?pageno="&rs.pagecount&qtemp&""">最后一页</a>]"
end if
%>
&nbsp;&nbsp;
<%
if cint(pageno)=rs.pagecount then
pagerecord=rs.recordcount-(pageno-1)*rs.pagesize
else
pagerecord=rs.pagesize
end if
response.write "共<font color=""ff0000"">"&rs.recordcount&"</font>条记录&nbsp;&nbsp;当前页为第<font color=""ff0000"">"&pageno&"</font>页&nbsp;&nbsp;该页有<font color=""ff0000"">"&pagerecord&"</font>条记录"
%>

这是我写的,跟楼主的大概一样功能,指教

#26
yfen2582006-06-19 17:07

不错 ~~~~

#27
hangxj2006-06-20 13:38
学习一下
#28
renqian13202006-06-21 01:24
版主,有个问题我想不通
就是显示数字导航和箭头导航的时候,怎么样控制这2个导航的具体位置呢?
共<%=rsTest.PageCount%>页 当前第<%=Request("page")%>页 <a href="59.asp?page=1&PageP=10" title="第一页" target="_self"><font face=webdings>9</font></a>
你代码这句,怎么样让他显示在自己想要的位置上.
帮我看看这篇文章.也是同样的问题https://www.bc-cn.net/bbs/dispbbs.asp?boardID=10&ID=73711&page=1
不知道是我测试的问题,还是代码功能问题?
就是在当前页的时候,这个时候,数字导航应该是没有超级连接的吧,就象这论坛一样,
我把你代码运行,没这个效果,同样的在当前页,当前页的数字导航还有超级连接?
半夜2点了,哎`睡不着啊`,
帮忙哦.版主 谢谢
#29
danhaoran2006-06-30 13:43

#30
monkey19312006-07-16 10:22

强烈支持

#31
yms1232006-07-16 10:50

回复28楼的
Private Function showNumBtn()
Dim i,str_tmp
For i=1 to int_totalpage
str_tmp=str_tmp & "[<a href=""" & XD_sURL & Cint(i) & """>"&i&"</a>] "
Next
showNumBtn=str_tmp
End Function
28楼的代码中这个部分应该是数字导航部分,
其实28楼的分页代码的ShowPage()编写的不灵活,
把分页代码直接在过程中Response.Write,所以无法控制出现位置。
而我的分页类是把导航部分可以单独提取出来,这样只要在页面初始化代码的下面的任意一个位置都可以用导航功能。
只要在需要的地方调用一下导航方法即可完成,这样做要灵活很多。

#32
renqian13202006-07-16 17:16
好东西顶下
#33
crsy2006-07-17 09:34
帮忙顶一下.
#34
xrlrainbow2006-11-06 18:48
菜鸟多谢啦
#35
探拓者2006-11-07 17:28
不知道哪能一种分页的效率高一点呢???
#36
yms1232006-11-07 21:54
目前最流行的是XML分页,不过ASP的目前本人还没做过呢。
#37
orangehf2006-11-07 22:21
必须要顶的!!!
#38
ming2062006-11-08 00:37
不错,我就是一直觉得这种方法的好。写成类模块嘛,让大家都用你的,。呵呵。记得“无根泉”的一个分页类相当不错
不知道大家还记得不。呵呵。强烈鼓励搞研究~!
#39
gdk20062006-11-08 13:13
下来研究一下!
先谢过楼主了!
#40
贝_贝2006-11-08 23:30
楼主你是一个一个代码按照自己的思路写出来的吗?厉害哦。
#41
lq73506842006-11-09 15:48
我有一个分页的也是一到最后一页就出错,我那个的错误是一到最后一页就不显示了,不知道是为什么.

<table width="99%" cellpadding="2" cellspacing="2" borderColorLight=#808080 borderColorDark=#ffffff>
<tr>
<%if rs.pagecount > 0 then%>
<td width="29%" height="40" align="left" class="tdbg1 STYLE8"> 共<%=rs.recordcount%>会员 当前页<%=intpage%>/<%=rs.PageCount%></td>
<%else%>
<td width="12%" align="left" class="tdbg1 STYLE8">当前页0/0</td>
<%end if%>
<td width="59%" align="center" class="tdbg1 STYLE8"><a href="?action=tryuser&page=1">首页</a>|
<%if pre then%>
<a href="?action=tryuser&page=<%=intpage -1%>">上一页</a>|
<%end if%>
<%if last then%>
<a href="?action=tryuser&page=<%=intpage +1%>">下一页</a> |
<%end if%>
<a href="?action=tryuser&page=<%=rs.PageCount%>">最后一页</a>| 转到第
<select name="sel_page" onchange="javascript:location=this.options[this.selectedIndex].value;">
<%
for i = 1 to rs.PageCount
if i = intpage then%>
<option value="?action=tryuser&page=<%=i%>" selected><%=i%></option>
<%else%>
<option value="?action=tryuser&page=<%=i%>"><%=i%></option>
<%
end if
next
%>
</select>页</td>
</tr>
</table>
#42
ming2062006-11-10 00:40
我刚又下下来看。原来跟我原来看另外一个人的一模一样,如果我没记错的话,这个代码的源创者应该是“无根泉”。我受不了。想要分页代码。结合存储过程做是最先进的,本人整理的存储过程分页就有几个。基本都是经过本人修改过。

这里推荐一下本人做的那个代码生成器里就有这个方法,虽然代码不一样,但是思想却是一样的。本人努力了几天做了那个自动生成代码的软件。可以说操作数据库的所有方法都有。以下仅列出一个分页方法的原理。

<%
''''''''''''''''类描述'''''''''''''''
'软件自动生成userInfos类所有内容
'该类名称:userInfos
'生成时间:2006-11-8 上午 12:08:38
'主要作用:
'''''''''''''''''''''''''''''''''''''
'类代码开始
Class userInfos

'List():返回带记录集数据,当返回一条记录时,其重定义为一维数组,当返回多条记录时,例如分页返回记录集,重定义为二维数组
'Row_N:字段个数,Col_N:某当前页产生的记录数,Counts:产生的总页数
Public List(), Row_N, Col_N,Counts
'构造,初始化
Private sub class_initialize()
'类初始器内根据需要可自行添加
End sub
'销毁资源
Private sub class_terminate()
'资源释放根据需要可自行添加
End sub
'私有数据成员

Private Address
Private CompanyAddress
'更多代码不贴了。


'''''''''''''''''''''''''''''''''''''''''''''''
'软件自动生成该方法
'方法名:getList
'作 用:返回当前页的记录集
'参 数:Fields_N,字段串
'参 数:Page_N,传递过来的当前页号
'参 数:Where_str,SQL语句的Where条,不需要带Where关键字,如果为空。则不连Where条件
'参 数:SortTy,确定数据库聚集,一般取ID自动编号
'参 数:OrderBy_S,排列顺序,可以自己选择:ASC或DESC
''
'''''''''''''''''''''''''''''''''''''''''''''''
Public Sub getList(Fields_N, Page_N, PageCount_N,SortTy,Where_S,OrderBy_S)
'局部变量说明:
'SQL:SQL字符串
'Rs:Recordset对象
'SQL:SQL字符串
'AllCounts:获得数据库中总的记录集
Dim SQL, Rs, AllCounts
Set Rs = Server.CreateObject("ADODB.Recordset")
'SQL字符串,目的是取得总记录集
SQL = "Select Count(*) AS Cn From [UserInfo_Table] "
'判断SQL语句的条件部分是否为空
If (Where_S <> "") Then
SQL=SQL&" Where " & Where_S
End If
'取得总记录集
AllCounts = conn.Execute(SQL).Fields(0)
'取得页数
'先用除法取整
Counts = CInt(AllCounts / PageCount_N)
'判断是否有余数
If (AllCounts Mod PageCount_N) <> 0 Then
'存在余数则页数+1
Counts = Counts + 1
End If
'当页号大于1时候设置为1
If (CInt(Page_N) < 1) Then Page_N = 1
'当页号大于总页数,设置为最后一页
If (CInt(Page_N) >= Counts) Then Page_N = Counts
'先判断是否为1,也就是小于2
If (CInt(Page_N) <= 1) Then
'如果是第一页,则直接取得前PageCount_N条记录
SQL = "SELECT TOP " & PageCount_N & Fields_N &"From [UserInfo_Table] ORDER BY "& OrderBy_S
Else
'否则,按以下规则进行过滤抽出记录集
SQL = "SELECT TOP " & PageCount_N & Fields_N
SQL=SQL&" FROM [UserInfo_Table] WHERE ("&SortTy&" NOT In (SELECT TOP " & ((CInt(PageCount_N))) * CInt(Page_N - 1) & ""&SortTy&" FROM [UserInfo_Table] ORDER BY "&OrderBy_S&" ))"
SQL=SQL&" ORDER BY "&OrderBy_S
End If
'打开数据库取当前页号的记录集
Rs.Open SQL, conn, 1, 1
'取得字段个数
Row_N = Rs.Fields.Count - 1
'取得当前记录的条数
Col_N = Rs.RecordCount - 1
'重定义二维数组
ReDim List(Row_N, Col_N)
'判断存在,循环输入数组
If Not Rs.EOF Then
'循环取出行记录
For i = 0 To Col_N
'如果到尾,跳出循环
If Rs.EOF Then Exit For
'循环取出字段
For j = 0 To Row_N
List(j, i) = Rs.Fields(j)
Next
'移动到下一条记录
Rs.MoveNext
Next
End If
'关闭
Rs.Close
Set Rs = Nothing
End Sub
End Class
%>

另外发几个利用PL/SQL编写的存储过程分页功能。调用我就不说了。
这两个绝对没有假,直接从我SQLSERVER里调试好弄出来的。

1.

CREATE PROCEDURE ShowPage_Proc
( --参数列表
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) ='' -- 查询条件 (注意: 不要加 where)
)

AS
--内部变量定义
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
--变量定义结束
if @doCount != 0
--如果@doCount传递过来的不是0,就执行总数统计。
begin
set @strSQL = "select count(*) as Total from [" + @tblName + "]"
if @strWhere !=""
--如果查询条件不为空,则加上Where条件语句
set @strSQL= @strSQL +" where "+@strWhere
end
else
--以下的所有代码都是@doCount为0的情况
begin
if @OrderType != 0
--如果@OrderType不是0,就执行降序
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @fldName +"] desc"
end
else
--否则,就执行升序
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @fldName +"] asc"
end
--如果启始页码为1
if @PageIndex = 1
begin
--如果查询条件不为空,则加上where条件
if @strWhere != ""
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "
        from [" + @tblName + "] where " + @strWhere + " " + @strOrder
else
--反之不加where条件
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "
        from ["+ @tblName + "] "+ @strOrder
end
--启始页码非1开始
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["
+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
+ @strOrder

--如果查询条件不为空,则加上where条件
if @strWhere != ""
set @strSQL = @strSQL+ ") as tblTmp) and " + @strWhere + " " + @strOrder
end
end
exec (@strSQL)
GO

2.

/*
函数名称: GetRecordFromPage
函数功能: 获取指定页的数据
参数说明: @tblName 包含数据的表名
@fldName 关键字段名
@PageSize 每页记录数
@PageIndex 要获取的页码
@IsCount 是否要取得记录数
@OrderType 排序类型, 0 - 升序, 1 - 降序
@strWhere 查询条件 (注意: 不要加 where)
*/
CREATE PROCEDURE pGO_GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(500) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

-- 如果是查询记录总数,直接使用Count(0)函数
if @IsCount != 0
begin
if @strWhere != ''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + '] '
end
--如果是想查询记录,则
else
begin
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end
else
begin
--如果是降序查询……
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
end
--如果是升序查询……
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder


end
end

exec (@strSQL)
GO


#43
五岳狂人2006-11-10 12:51
谢谢

#44
hu9jj2006-11-11 06:12
我目前的页面上还没有加分页功能,这些好东西我先收下了,看懂之后再加到页面中去,在此谢谢各位。
#45
janefishfish2006-11-11 11:46
支持下先
#46
bafnje2007-01-25 16:08
好像到最后一页的时候,有点问题.
#47
melack2007-01-26 09:48
谢谢 版主
#48
cdwyj2007-02-24 03:30
挖到宝了…… 研究一下
#49
清音2007-02-27 16:44
都不错啊
#50
dk_fan2007-02-27 17:13
#51
yutaozj2007-04-02 21:49
收藏了研究下
123