/*--实现分页的通用存储过程 显示指定表、视图、查询结果的第X页
对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
如果视图或查询结果中有主键,不推荐此方法
如果使用查询语句,而且查询语句使用了order by,则查询语句必须包含top 语句
 --感谢csdn.net邹建  --*//*--调用示例
exec p_show '地区资料' exec p_show 'select top 100 percent * from 地区资料 order by 地区名称',5,3,'地区编号,地区名称,助记码'
--*/
CREATE Proc p_show
@QueryStr nvarchar(4000), --表名、视图名、查询语句
@PageSize int=20, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (4000)='', --要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
set nocount on
declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
,@Obj_ID int --对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000) --复合主键列表
,@strjoin nvarchar(4000) --连接字段
,@strwhere nvarchar(2000) --查询条件
select @Obj_ID=object_id(@QueryStr)
,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end--如果显示第一页,可以直接用top来完成
if @PageCurrent=1
begin
select @Id1=cast(@PageSize as varchar(20))
exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
return
end--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
select @Id1=cast(@PageSize as varchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
if @@rowcount=0 --如果表中无标识列,则检查表中是否有主键
begin
if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
goto lbusetemp --如果表中无主键,则用临时表处理 select @FdName=name from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
if @@rowcount>1 --检查表中的主键是否为复合主键
begin
select @strfd='',@strjoin='',@strwhere=''
select @strfd=@strfd+',['+name+']'
,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
,@strwhere=@strwhere+' and b.['+name+'] is null'
from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
select @strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
goto lbusepk
end
end
end
else
goto lbusetemp/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity:
exec('select top '+@Id1+@FdShow+' from '+@QueryStr
+' where '+@FdName+' not in(select top '
+@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
+')'+@FdOrder
)
return/*--表中有复合主键的处理方法--*/
lbusepk:
exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
(select top 100 percent * from '+@QueryStr+@FdOrder+') a
left join (select top '+@Id2+' '+@strfd+' 
from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
where '+@strwhere+') a'
)
return/*--用临时表处理的方法--*/
lbusetemp:
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
into #tb from'+@QueryStr+@FdOrder+'
select '+@FdShow+' from #tb where '+@FdName+' between '
+@Id1+' and '+@Id2
)
GO

解决方案 »

  1.   

    <%
    '打开数据库连接过程
    dim db,conn,myconn
    'db="mdb/21away.mdb"
    Set Conn = Server.CreateObject("ADODB.Connection")
    'myconn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
    'Conn.Open MyConn
    myconn="Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=book_shop;Data Source=wh"
    Conn.Open MyConn上面方法是用连接字符串的方法连接的。可以使用。
      

  2.   

    首先给你的是个翻页显示模块。
    …………………………………………………………………………………………………………………………………………………………
    <% 
    '+++++++++++++++++++++++++++++++++++++ 
    '◆模块名称: 公共翻页模块 
    '◆文 件 名: TurnPage.asp 
    '◆传入参数: Rs_tmp (记录集), PageSize (每页显示的记录条数) 
    '◆输 出: 记录集翻页显示功能 
    '+++++++++++++++++++++++++++++++++++++ 

    Sub TurnPage(ByRef Rs_tmp,PageSize) 'Rs_tmp 记录集  PageSize 每页显示的记录条数; 
    Dim TotalPage '总页数 
    Dim PageNo '当前显示的是第几页 
    Dim RecordCount '总记录条数 
    Rs_tmp.PageSize = PageSize 
    RecordCount = Rs_tmp.RecordCount 
    TotalPage = INT(RecordCount / PageSize * -1)*-1 
    PageNo = Request.QueryString ("PageNo") 
    '直接输入页数跳转; 
    If Request.Form("PageNo")<>"" Then PageNo = Request.Form("PageNo") 
    '如果没有选择第几页,则默认显示第一页; 
    If PageNo = "" then PageNo = 1 
    If RecordCount <> 0 then 
    Rs_tmp.AbsolutePage = PageNo 
    End If '获取当前文件名,使得每次翻页都在当前页面进行; 
    Dim fileName,postion 
    fileName = Request.ServerVariables("script_name") 
    postion = InstrRev(fileName,"/")+1 
    '取得当前的文件名称,使翻页的链接指向当前文件; 
    fileName = Mid(fileName,postion) 
    %> 
    <table border=0 width='100%'> 
    <tr> 
    <td align=left> 总页数:<font color=#ff3333><%=TotalPage%></font>页 
      当前第<font color=#ff3333><%=PageNo%></font>页</td> 
    <td align="right"> 
    <%If RecordCount = 0 or TotalPage = 1 Then 
    Response.Write "首页|前页|后页|末页" 
    Else%> 
    <a href="<%=fileName%>?PageNo=1">首页|</a> 
    <%If PageNo - 1 = 0 Then 
    Response.Write "前页|" 
    Else%> 
    <a href="<%=fileName%>?PageNo=<%=PageNo-1%>">前页|</a> 
    <%End If If PageNo+1 > TotalPage Then 
    Response.Write "后页|" 
    Else%> 
    <a href="<%=fileName%>?PageNo=<%=PageNo+1%>">后页|</a> 
    <%End If%> <a href="<%=fileName%>?PageNo=<%=TotalPage%>">末页</a> 
    <%End If%></td> 
    <td width=95>转 
    <%If TotalPage = 1 Then%> 
    <input type=text name=PageNo size=3 readonly disabled style="background:#d3d3d3"> 
    <%Else%> 
    <input type=text name=PageNo size=3 value="" title=请输入页号,然后回车> 
    <%End If%>页 
    </td> 
    </tr> 
    </table> 
    <%End Sub%>
    …………………………………………………………………………………………………………………………………………………………
    然后这个文件就是例子,可以连接后直接使用。没有问题,我刚在我的项目中使用的。
    …………………………………………………………………………………………………………………………………………………………
    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <!--#include file=Page.asp--> 
    <title>医药图书信息查询</title>
    <style type="text/css">
    <!--
    body {
    background-image: url(../images/testback.gif);
    }
    -->
    </style></head><body><p>
     <%
    dim db,conn,myconn
    Set Conn = Server.CreateObject("ADODB.Connection")
    myconn="Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=book_shop;Data Source=wh"
    Conn.Open MyConn
      sql= "select * from book_info"
      Set rs = Server.CreateObject("ADODB.Recordset")
      rs.OPEN sql,Conn,1,1
    Dim RowCount 
    RowCount =10 '每页显示的记录条数 
    Call TurnPage(Rs,RowCount) 
    %>
    </p>
    <table width="100%"  border="0" cellspacing="0" cellpadding="0">
      <tr>
        <th scope="col">序号</th>
        <th scope="col">名称</th>
        <th scope="col">作者</th>
      </tr>
    <%  if rs.eof and rs.bof then
        Response.Write"没有数据!"
      else
        do while (not rs.eof and RowCount > 0 )
    Response.Write"<tr><td>"&rs("id")&"</td><td><a href='../dt.asp?id="&rs("id")&"' >"&rs("book_name")&"</a></td><td>"&rs("author")&"</td></tr>"
        Response.Write"<br>"
        rs.movenext
        RowCount = RowCount - 1 
        loop
      end if
      rs.close
      Set rs=Nothing
    %>
    </table>
    </body>
    </html>=========================================================================
    怎么样,没有问题吧,注意在调用的时候要定义一个叫做RowCount(每页显示的记录条数 )的参数,而且,对于while条件中间需要修改条件。
      

  3.   

    这个价值超过200分
    巨快,分页演示,通用表维护
    http://www.adr.gov.cn/download/panyuguang/adrnew/dict_List.asp
    下载
    http://www.adr.gov.cn/download/panyuguang/adrnew.rar