• 分页存储过程的应用简单示例随笔(附所有代码)


    需要的自己拿着去用起,很简单的分页存储过程示例!!!

    一.在SQL SERVER中先创建一个数据库表:

     

    1 CREATE TABLE [dbo].[zhq_content](
    2     [content_id] [bigint] NOT NULL primary key identity,
    3     [columns_id] [smallint] NOT NULL,
    4     [title] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL,
    5     [body] [text] COLLATE Chinese_PRC_CI_AS NULL,
    6     [createdate] [datetime] NULL,
    7     [modifieddate] [datetime] NULL,
    8     [issuedate] [datetime] NULL
    9     )

    二,向表中随意插入数据

     1 declare @id  int
     2 set  @id=1
     3 
     4 while(@id<360)
     5 begin
     6 INSERT INTO [ForeTechTest].[dbo].[zhq_contenttest]
     7            ([columns_id]
     8            ,[title]
     9            ,[body]
    10            ,[createdate]
    11            ,[modifieddate]
    12            ,[issuedate])
    13      VALUES
    14            (10
    15            ,'title'+cast(@id as varchar)
    16            ,'body'+cast(@id as varchar)
    17            ,getdate()
    18            ,getdate()
    19            ,getdate());
    20 set @id=@id+1;
    21 
    22 end
    23 

    三.构建页面效果

     

     1 <head runat="server">
     2     <title>分页显示</title>
     3 </head>
     4 <body>
     5     <form id="form1" runat="server">
     6     <div>
     7     <table><tr><td>
     8     <ul>
     9       <asp:Repeater  EnableViewState="false" runat="server" ID="repeater">
    10              <ItemTemplate> 
    11             <li> <%# DataBinder.Eval(Container, "DataItem.content_id")%>    --- <%# DataBinder.Eval(Container, "DataItem.body").ToString()%> ---    <%# DataBinder.Eval(Container, "DataItem.createdate").ToString()%></li>
    12              </ItemTemplate>            
    13       </asp:Repeater>
    14      </ul>
    15       </td></tr></table>
    16       
    17       <table><tr>
    18       <td>
    19           当前第<asp:Label ID="lblCurrentPage" runat="server" Text="Label"></asp:Label>/总共<asp:Label
    20               ID="lblPageCount" runat="server" Text="Label"></asp:Label>/总共<asp:Label ID="lblCount"
    21                   runat="server" Text="Label"></asp:Label></td><td>
    22           <input id="btnFirst" type="button" value="first"  runat="server" onserverclick="btnFirst_ServerClick"  /></td>
    23           <td><input id="btnPriority" type="button" value="priority"  runat="server" onserverclick="btnPriority_ServerClick"  /></td>
    24           <td><input id="btnNext" type="button" value="next"  runat="server" onserverclick="btnNext_ServerClick"  /></td>
    25           <td><input id="btnLast" type="button" value="last"  runat="server" onserverclick="btnLast_ServerClick"  /></td>
    26           </tr>
    27       </table>
    28     </div>
    29     </form>
    30 </body>
    31 </html>

    四.别人写的二分制分页存储过程,不知道哪位大虾的,哈哈,拿过来用起,代码如下:

     

      1 set ANSI_NULLS ON
      2 set QUOTED_IDENTIFIER ON
      3 go
      4 
      5 
      6 
      7 ALTER PROCEDURE [dbo].[ProcPagedSelectMax] 
      8  ( 
      9   @tblName     nvarchar(200),        ----要显示的表或多个表的连接 
     10   @fldName     nvarchar(500= '*',    ----要显示的字段列表 
     11   @pageSize    int = 10,        ----每页显示的记录个数 
     12  @page        int = 1,        ----要显示那一页的记录 
     13  @fldSort    nvarchar(200= null,    ----排序字段列表或条件 
     14  @Sort        bit = 0,        ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC '
     15  @strCondition    nvarchar(1000= null,    ----查询条件,不需where 
     16  @ID        nvarchar(150),        ----主表的主键 
     17  @Dist                 bit = 0,           ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 
     18  @pageCount    int = 1 output,            ----查询结果分页后的总页数 
     19  @Counts    int = 1 output                ----查询到的记录数 
     20  ) 
     21  AS 
     22  SET NOCOUNT ON 
     23  Declare @sqlTmp nvarchar(1000)        ----存放动态生成的SQL语句 
     24  Declare @strTmp nvarchar(1000)        ----存放取得查询结果总数的查询语句 
     25  Declare @strID     nvarchar(1000)        ----存放取得查询开头或结尾ID的查询语句 
     26  
     27  Declare @strSortType nvarchar(10)    ----数据排序规则A 
     28  Declare @strFSortType nvarchar(10)    ----数据排序规则B 
     29  
     30  Declare @SqlSelect nvarchar(50)         ----对含有DISTINCT的查询进行SQL构造 
     31  Declare @SqlCounts nvarchar(50)          ----对含有DISTINCT的总数查询进行SQL构造 
     32  
     33  declare @timediff datetime  --耗时测试时间差 
     34  select @timediff=getdate() 
     35  
     36  if @Dist  = 0 
     37  begin 
     38      set @SqlSelect = 'select ' 
     39      set @SqlCounts = 'Count(*)' 
     40  end 
     41  else 
     42  begin 
     43      set @SqlSelect = 'select distinct ' 
     44      set @SqlCounts = 'Count(DISTINCT '+@ID+')' 
     45  end 
     46  
     47  if @Sort=0 
     48  begin 
     49      set @strFSortType=' ASC ' 
     50      set @strSortType=' DESC ' 
     51  end 
     52  else 
     53  begin 
     54      set @strFSortType=' DESC ' 
     55      set @strSortType=' ASC ' 
     56  end 
     57 
     58  --------生成查询语句-------- 
     59  --此处@strTmp为取得查询结果数量的语句 
     60  if @strCondition is null or @strCondition=''     --没有设置显示条件 
     61  begin 
     62      set @sqlTmp =  @fldName + ' From ' + @tblName 
     63      set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName 
     64      set @strID = ' From ' + @tblName 
     65  end 
     66  else 
     67  begin 
     68      set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 
     69      set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition 
     70      set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition 
     71  end 
     72  
     73  ----取得查询结果总数量----- 
     74  exec sp_executesql @strTmp,N'@Counts int out ',@Counts out 
     75  declare @tmpCounts int 
     76  if @Counts = 0 
     77      set @tmpCounts = 1 
     78  else 
     79      set @tmpCounts = @Counts 
     80  
     81      --取得分页总数 
     82      set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize 
     83  
     84     /**//**//**//**当前页大于总页数 取最后一页**/ 
     85      if @page>@pageCount 
     86          set @page=@pageCount 
     87  
     88      --/*-----数据分页2分处理-------*/ 
     89      declare @pageIndex int --总数/页大小 
     90      declare @lastcount int --总数%页大小  
     91  
     92      set @pageIndex = @tmpCounts/@pageSize 
     93      set @lastcount = @tmpCounts%@pageSize 
     94      if @lastcount > 0 
     95          set @pageIndex = @pageIndex + 1 
     96      else 
     97          set @lastcount = @pagesize 
     98  
     99     --//***显示分页 
    100     if @strCondition is null or @strCondition=''     --没有设置显示条件 
    101     begin 
    102         if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理 
    103             begin  
    104                 if @page=1 
    105                    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                         
    106                         +' order by '+ @fldSort +' '+ @strFSortType 
    107                 else 
    108                 begin 
    109                     if @Sort=1 
    110                     begin                     
    111                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    112                         +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1as Varchar(20)) +' '+ @ID +' from '+@tblName 
    113                         +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    114                         +' order by '+ @fldSort +' '+ @strFSortType 
    115                    end 
    116                     else 
    117                     begin 
    118                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    119                         +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1as Varchar(20)) +' '+ @ID +' from '+@tblName 
    120                        +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    121                         +' order by '+ @fldSort +' '+ @strFSortType  
    122                     end 
    123                 end     
    124             end 
    125         else 
    126             begin 
    127             set @page = @pageIndex-@page+1 --后半部分数据处理 
    128                 if @page <= 1 --最后一页数据显示                 
    129                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    130                         +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType  
    131                 else 
    132                     if @Sort=1 
    133                     begin 
    134                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    135                         +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    136                         +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    137                         +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    138                     end 
    139                     else 
    140                     begin 
    141                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    142                         +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    143                         +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    144                         +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType  
    145                     end 
    146             end 
    147     end 
    148 
    149     else --有查询条件 
    150     begin 
    151         if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2   --前半部分数据处理 
    152         begin 
    153                 if @page=1 
    154                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName                         
    155                         +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType 
    156                 else if(@Sort=1
    157                 begin                     
    158                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    159                         +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1as Varchar(20)) +' '+ @ID +' from '+@tblName 
    160                         +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    161                         +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType 
    162                 end 
    163                 else 
    164                 begin 
    165                     set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    166                         +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1as Varchar(20)) +' '+ @ID +' from '+@tblName 
    167                         +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    168                         +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType  
    169                 end            
    170         end 
    171         else 
    172         begin  
    173             set @page = @pageIndex-@page+1 --后半部分数据处理 
    174             if @page <= 1 --最后一页数据显示 
    175                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    176                         +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType                      
    177             else if(@Sort=1
    178                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    179                         +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    180                         +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    181                         +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType     
    182             else 
    183                     set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 
    184                         +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName 
    185                         +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    186                         +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType             
    187         end     
    188     end
    189 print (@strTmp)
    190 ------返回查询结果----- 
    191 exec sp_executesql @strTmp 
    192 select datediff(ms,@timediff,getdate()) as 耗时 
    193 --print @strTmp 
    194 SET NOCOUNT OFF 
    195 
    196 
    197 
    198 
    199 
    200 

    五。最主要的是编写后台代码,现在我把最简单的操作集成一下,写了我2个来小时,应该是没有BUG了的:

      1 using System;
      2 using System.Data;
      3 using System.Configuration;
      4 using System.Collections;
      5 using System.Web;
      6 using System.Web.Security;
      7 using System.Web.UI;
      8 using System.Web.UI.WebControls;
      9 using System.Web.UI.WebControls.WebParts;
     10 using System.Web.UI.HtmlControls;
     11 
     12 using System.Data.SqlClient;
     13 
     14 public partial class PageSort_Default : System.Web.UI.Page
     15 {
     16     protected int pageCount;
     17     protected int counts;
     18     protected int pageIndex;
     19     protected void Page_Load(object sender, EventArgs e)
     20     {
     21         if (Request.QueryString["pageIndex"== null)
     22         {
     23             pageIndex = 1;
     24         }
     25         else
     26         {
     27             pageIndex = int.Parse(Request.QueryString["pageIndex"].ToString());
     28         }
     29 
     30         BindContent(out pageCount, out counts, 20, pageIndex);
     31         lblPageCount.Text = pageCount.ToString();
     32         lblCount.Text = counts.ToString();
     33         lblCurrentPage.Text = pageIndex.ToString();
     34     }
     35 
     36     private void BindContent(out int pageCount,out int counts,int pageSize,int pageIndex )
     37     {
     38         DataSet ds = BindContent("zhq_contenttest","*",pageSize,pageIndex,"and  columns_id=10","content_id",1,"content_id",0,out pageCount ,out counts);
     39         if(ds!=null&&ds.Tables[0].Rows.Count>0)
     40         {
     41             repeater.DataSource = ds;
     42             repeater.DataBind();
     43         }
     44     }
     45 
     46     private DataSet BindContent(string tbName, string filedName, int pageSize, int pageIndex, string condition, string sortedField, int sortType, string id, int distinctType, out int pageCount, out int count)
     47     {
     48         DataSet ds;
     49         SqlConnection conn;
     50         using (conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["foretechtest"].ToString()))
     51         {
     52             SqlParameter[] paras = new SqlParameter[11];
     53             paras[0= new SqlParameter("@tblName", SqlDbType.NVarChar, 200);
     54             paras[0].Value = tbName;
     55             paras[1= new SqlParameter("@fldName", SqlDbType.NVarChar, 500);
     56             paras[1].Value = filedName;
     57             paras[2= new SqlParameter("@pageSize", SqlDbType.Int);
     58             paras[2].Value = pageSize;
     59             paras[3= new SqlParameter("@page", SqlDbType.Int);
     60             paras[3].Value = pageIndex;
     61 
     62             paras[4= new SqlParameter("@strCondition", SqlDbType.NVarChar, 1000);
     63             paras[4].Value = condition;
     64             paras[5= new SqlParameter("@fldSort", SqlDbType.NVarChar, 200);
     65             paras[5].Value = sortedField;
     66             paras[6= new SqlParameter("@Sort", SqlDbType.Bit);
     67             paras[6].Value = sortType;
     68 
     69             paras[7= new SqlParameter("@ID", SqlDbType.NVarChar, 150);
     70             paras[7].Value = id;
     71             paras[8= new SqlParameter("@Dist", SqlDbType.Bit);
     72             paras[8].Value = distinctType;
     73             paras[9= new SqlParameter("@pageCount", SqlDbType.Int);
     74             paras[9].Direction = ParameterDirection.Output;
     75             paras[10= new SqlParameter("@Counts", SqlDbType.Int);
     76             paras[10].Direction = ParameterDirection.Output;
     77             try
     78             {
     79                 conn.Open();
     80                 ds = new DataSet();
     81                 SqlDataAdapter da = new SqlDataAdapter("ProcPagedSelectMax", conn);
     82                 da.SelectCommand.CommandType = CommandType.StoredProcedure;
     83                 foreach(SqlParameter para in paras)
     84                 {
     85                     da.SelectCommand.Parameters.Add(para);
     86                 }
     87                 da.Fill(ds);
     88 
     89             }
     90             finally
     91             {
     92                 conn.Close();
     93                 pageCount = int.Parse(paras[9].Value.ToString());
     94                 count = int.Parse(paras[10].Value.ToString());
     95             }
     96             return ds;
     97 
     98         }
     99         /*
    100          * @tblName = N' zhq_contenttest',
    101         @fldName = N'*',
    102         @pageSize = 20,
    103         @page = 5,
    104         @strCondition=N' and  columns_id=11  ',
    105         @fldSort = N' createdate ',
    106         @Sort = 1,
    107         @ID = N'content_id ',
    108         @Dist = 0,
    109         @pageCount = @pageCount OUTPUT,
    110         @Counts = @Counts OUTPUT
    111 
    112 SELECT    @pageCount as N'@pageCount',
    113         @Counts as N'@Counts'*/
    114     }
    115 
    116 
    117     protected void btnPriority_ServerClick(object sender, EventArgs e)
    118     {
    119         if (int.Parse(lblCurrentPage.Text.ToString()) <= 1)
    120         {//control this range  pageindex  >//=1
    121             pageIndex = 1;
    122         }
    123         else 
    124         {//
    125             pageIndex = int.Parse(lblCurrentPage.Text.ToString()) - 1;
    126         }
    127         Response.Redirect("Default.aspx?pageIndex=" +pageIndex);
    128     }
    129     protected void btnNext_ServerClick(object sender, EventArgs e)
    130     {
    131         if (int.Parse(lblCurrentPage.Text.ToString()) >= pageCount)
    132         {
    133             pageIndex = pageCount;
    134         }
    135         else 
    136         {
    137             pageIndex = int.Parse(lblCurrentPage.Text.ToString()) + 1;
    138         }
    139         Response.Redirect("Default.aspx?pageIndex=" + pageIndex);
    140     }
    141     protected void btnLast_ServerClick(object sender, EventArgs e)
    142     {
    143         Response.Redirect("Default.aspx?pageIndex="+lblPageCount.Text.ToString().Trim());
    144     }
    145     protected void btnFirst_ServerClick(object sender, EventArgs e)
    146     {
    147         Response.Redirect("Default.aspx?pageIndex=1");
    148     }
    149 }
    150 

           感觉速度还是相当快的..........如果要应用到其他的方面,修改下其他的参数即可。

    显示如下:

    *****************************************************************

    为了安全通过控制

    if (int.Parse(lblCurrentPage.Text.ToString()) <= 1)
            {
                pageIndex = 1;
            }
            else
            {
                pageIndex = int.Parse(lblCurrentPage.Text.ToString()) - 1;
            }

     和if (int.Parse(lblCurrentPage.Text.ToString()) >= pageCount)
            {
                pageIndex = pageCount;
            }
            else
            {
                pageIndex = int.Parse(lblCurrentPage.Text.ToString()) + 1;
            }

    控制范围不超出索引。

    同样可以通过页面的生成过程来控制控件的显示状态:

      protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["pageIndex"] == null)
            {
                pageIndex = 1;
            }
            else
            {
                pageIndex = int.Parse(Request.QueryString["pageIndex"].ToString());
            }

            BindContent(out pageCount, out counts, 20, pageIndex);
            lblPageCount.Text = pageCount.ToString();
            lblCount.Text = counts.ToString();
            lblCurrentPage.Text = pageIndex.ToString();
            if (lblCurrentPage.Text.ToString() == pageCount.ToString())
            {
                btnNext.Visible = false;
            }
            else
            {
                btnNext.Visible = true;
            }
            if (lblCurrentPage.Text.ToString() == "1")
            {
                btnFirst.Visible = false;
            }
            else
            {
                btnFirst.Visible = true;
            }
          
        }

    主要是需要掌握页面的生命周期,加以控制。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    http://www.cnblogs.com/jasenkin/archive/2010/03/23/1692562.html

  • 相关阅读:
    MongoDB
    Mac下将Python2.7改为Python3
    Kafka
    Server 基础概念 备忘
    应用内支付
    Sign in with apple
    Linux三剑客grep/sed/awk
    React-Native中使用到的一些JS特性
    Date Picker控件:
    Picker View控件:
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1809009.html
Copyright © 2020-2023  润新知