分页存储过程
- USE [MyTest]
- GO
- /****** Object: StoredProcedure [dbo].[PageTable] Script Date: 03/02/2012 15:11:29 ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- --- 分页的存储过程
- Create procedure [dbo].[PageTable]
- @tableName varchar(200), ---表名
- @fieldList varchar(2000),---显示列名
- @primaryKey varchar(100),---单一主键或唯一值键
- @where varchar(5000),---查询条件 不含‘where’字符
- @order varchar(1000),---排序 不含‘order by’ 如id desc ,userid asc 当@sortType=3时生效
- @sortType int,---排序规则 1.正序 asc 2. 倒序 desc 3.多列排序
- @recorderCount int,---记录总数,会返回总记录数
- @PageSize int,---每页输出的记录数
- @PageIndex int,---当前页数
- @totalCount int output,---返回记录总数
- @totalPageCount int output---返回总页数
- as
- begin
- if ISNULL(@tableName,'')='' OR ISNULL(@fieldList,'')='' ----确保主要的几个输入参数有效
- OR ISNULL (@primaryKey,'')=''
- OR @sortType<1 OR @sortType>3
- OR @recorderCount<0 OR @PageSize<0 OR @PageIndex<0
- begin
- return
- end
- declare @new_where1 varchar(3000)
- declare @new_where2 varchar(3000)
- declare @new_order varchar(1000)
- declare @sql varchar(8000)
- declare @sqlCount nvarchar(4000) --- SP_EXECUTESQl 第一个参数必须是"ntext/nchar/nvarchar"类型
- if ISNULL (@where ,'')='' --@where 为null 的话替换成 ‘’,然后判断 @where=''?
- begin
- set @new_where1=''
- set @new_where2=' where '
- end
- else --若@where 不为空 ,设置@new_where1 和@new_where2 ,包含‘where’字符
- begin
- set @new_where1=' where '+@where
- set @new_where2=' where '+@where +' and '
- end
- if ISNULL(@order ,'')='' OR @sortType=1 OR @sortType=2 --简单排序
- begin
- if @sortType=1 set @new_order=' order by '+@primaryKey+' asc '
- if @sortType=2 set @new_order =' order by '+@primaryKey+' desc '
- end
- else --多列排序 @sortType=3 && @order<>''
- begin
- set @new_order=' order by '+@order
- end
- --ceiling (29.0)取出大于或等于29.0的最小整数 29
- --ceiling (29.1)取出大于或等于29.0的最小整数 30
- --CEILING(COUNT(*)+0.0)/CAST(4 as varchar) as TotalPageCount
- set @sqlCount='select @totalCount=count(*), @totalPageCount=ceiling((count(*)+0.0)/'+CAST(@PageSize as varchar)
- +') from '+@tableName +''+@new_where1
- --设置 @totalCount @totalPageCount 的值 ,总页数=总记录数/每页记录数(恰为整数) 总页数=总记录数/每页记录数+1(最后不是整页)
- if @recorderCount=0
- begin
- ---SP_EXECUTESQl 执行动态sql :@sqlCount是动态sql的定义,
- --N'@totalCount int output,@totalPageCount int output'是 对动态sql中变量的声明
- --@totalCount output,@totalPageCount output 是对变量的赋值
- exec SP_EXECUTESQl @sqlCount,N'@totalCount int output ,@totalPageCount int output',@totalCount output,@totalPageCount output
- end
- else
- begin
- select @recorderCount=@totalCount
- end
- if @PageIndex>CEILING((@totalCount+0.0)/@PageSize)
- begin
- set @PageIndex=CEILING((@totalCount+0.0)/@pageSize)--将超出最大范围的页 设置为最后一页
- end
- if @PageIndex=0
- begin
- set @PageIndex=1 --将超出最小范围的页 设置为第一页
- end
- if @PageIndex=1 --选择第一页的数据
- begin
- set @sql ='select top '+STR(@PageSize)+''+@fieldList+' from '+@tableName+''+@new_where1+''+@new_order
- end
- else --其他页时
- begin
- if @sortType=1 --普通升序 primary key asc
- begin
- set @sql='select top '+STR(@PageSize)+''+@fieldList +' from '+@tableName+''+@new_where2+'' +@primaryKey+'>'
- +'(select MAX('+@primaryKey+') from (select top '+STR(@pageSize *(@PageIndex-1))+''+@primaryKey+' from '
- +@tableName+''+@new_where1+''+@new_order+') as TMP)'+@new_order
- end
- if @sortType=2 --普通降序 primary key desc
- begin
- --if @PageIndex=1
- --begin
- --set @sql='select top '+STR(@PageSize)+''+@fieldList +' from '+@tableName+''+@new_order
- --end
- --else
- --begin
- set @sql='select top '+STR(@PageSize)+''+@fieldList +' from '+@tableName+''+@new_where2 +''+@primaryKey+'<'
- +'(select MIN('+@primaryKey+') from (select top '+STR(@pageSize *(@PageIndex-1))+''+@primaryKey+' from '
- +@tableName+''+@new_where1+''+@new_order+') as TMP)'+@new_order
- --end
- end
- if @sortType=3 ---多列排序
- begin
- set @sql='select top'+STR(@PageSize)+''+@fieldList+' from '+@tableName+''+@new_where2+''+@primaryKey
- +' not in(select top '+STR(@PageSize*(@pageIndex-1))+''+@primaryKey+' from '+@tableName+''+@new_where1
- +''+@new_order+')'+@new_order
- end
- end
- exec (@sql)
- end
- --测试 例子
- --declare @totalCount int
- --declare @totalPageCount int
- --exec dbo.PageTable 'Category','id,name,class, grade','id','grade>=60','grade desc ,name asc',3,12,6,1,@totalCount ,@totalPageCount
aspx页面
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ViewDetail.aspx.cs" Inherits="ViewDetail" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title></title>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- <%=tableString %> <%--获取后天拼接的 html--%> <%-- 获取后台变量值--%>
- 当前页码:<asp:Label ID ="lblPage" runat="server" ><%=Session["pageIndex"]%></asp:Label>
- 总页码:<asp:Label ID ="lblTag" runat="server"><%=totalPageCount %></asp:Label>
- 总条数:<asp:Label ID ="Label1" runat="server"><%=totalCount %></asp:Label>
- <%-- 测试:<asp:Label ID ="Label1" runat="server" ><%=test %></asp:Label>--%> <%-- 服务器端控件 (取后台变量的值)--%>
- <%-- 测试2 :<input id="Text2" type="text" value='<%=test %>' />--%> <%-- 客户端控件 (取后台变量的值)--%>
- <br />
- <asp:LinkButton ID="lbtnFirst" runat="server" onclick="lbtnFirst_Click">第一页</asp:LinkButton>
- <asp:LinkButton ID="lbtnPre" runat="server" onclick="lbtnPre_Click">上一页</asp:LinkButton>
- <asp:LinkButton ID="lbtnNext" runat="server" onclick="lbtnNext_Click">下一页</asp:LinkButton>
- <asp:LinkButton ID="lbtnLast" runat="server" onclick="lbtnLast_Click">最后一页</asp:LinkButton>
- <%--本例中仅用到 <%=变量名%> ,以下是与本例无关的几种相似结构 <% # 字段名%> <% %>--%>
- <%-- 1. <% %> :内联代码块,可以在 *.aspx 或 *.ascx 文件里嵌入后台代码 --%>
- <%-- <%
- for (int i = 0; i < 20; i++)
- {
- Response.Write(i);
- }
- %> --%>
- <%-- 2. <% @ %> 是在 *.aspx页面前台代码导入命名空间 ,像本文第一行--%>>
- <%-- < %@ Import namespace="System.Data"%>--%>
- <%-- 3. < %#... %>: 是在绑定控件DataBind()方法执行时被执行,用于数据绑定,取绑定某字段值--%>
- <%-- <%#DataBinder.Eval(Container.DataItem,"name") %>--%>
- <%-- 4. < %= %>: 在程序执行时被调用,可以显示后台变量值--%>
- <%--< %=name %> --%>
- <%-- 对应的 *.cs中: protected string name="姓名"; 其中访问修饰符最低为 protected,否则取不到值的--%>
- </div>
- </form>
- </body>
- </html>
C#后台代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Configuration;
- using System.Data;
- using System.Data.SqlClient;
- using System.Text;
- public partial class ViewDetail : System.Web.UI.Page
- {
- private string StrConn = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString.ToString();
- public string name;
- public string classname;
- protected string tableString;
- public static int totalPageCount;
- public static int totalCount; //注意定义为静态 否则在链接事件(选择页面事件)中取不到值
- //public int test=100; // 与本例无关,用于区分aspx页面服务器控件、 客户端控件 取后台值的不同 ,见aspx页面中对应的注册部分
- protected void Page_Load(object sender, EventArgs e)
- {
- //Response.Write("由页面Default传过来的记录 ID 是 "+Request.QueryString["id"]) ;
- if (!IsPostBack)
- {
- Session["pageIndex"] = 1;//页面初加载,显示第一页数据 ,Session["pageIndex"]保存当前显示页码
- BindRepeater();
- }
- }
- private void BindRepeater()
- {
- //定义接收数据的表结构
- DataTable tb = new DataTable();
- tb.Columns.Add("id");
- tb.Columns.Add("name");
- tb.Columns.Add("class");
- SqlConnection conn = new SqlConnection(StrConn);
- conn.Open();
- SqlCommand cmd = new SqlCommand();
- cmd.CommandType = CommandType.StoredProcedure;//指定是存储过程
- cmd.CommandText = "PageTable";// 过程的名字
- #region 参数必须与存储过程的参数一一对应
- //定义输入参数
- cmd.Parameters.Add(new SqlParameter("@tableName", SqlDbType.VarChar)).Value = "Category"; //表名
- cmd.Parameters.Add(new SqlParameter("@fieldList", SqlDbType.VarChar)).Value = "id,name,class";// 获取的字段
- cmd.Parameters.Add(new SqlParameter("@primaryKey", SqlDbType.VarChar)).Value = "id";//主键列
- cmd.Parameters.Add(new SqlParameter("@where", SqlDbType.VarChar)).Value = "grade>=60";//不包含where 关键字的条件
- cmd.Parameters.Add(new SqlParameter("@order", SqlDbType.VarChar)).Value = "grade desc ,name asc";//不包含order by 关键字的排序条件
- cmd.Parameters.Add(new SqlParameter("@sortType", SqlDbType.Int)).Value = 3; //1 正序 2 倒序 3 组合排序 ( 选为 3 时, @order 才有效)
- cmd.Parameters.Add(new SqlParameter("@recorderCount", SqlDbType.Int)).Value = 0;//记录总数
- cmd.Parameters.Add(new SqlParameter("@PageSize", SqlDbType.Int)).Value = 6;//页面大小(记录数量)
- cmd.Parameters.Add(new SqlParameter("@PageIndex", SqlDbType.Int)).Value = Session["pageIndex"];//当前页数
- //定义输出参数
- SqlParameter sp = cmd.Parameters.Add(new SqlParameter("@totalCount", SqlDbType.Int)); // 总记录数量
- sp.Direction = ParameterDirection.Output;
- SqlParameter sp2 = cmd.Parameters.Add(new SqlParameter("@totalPageCount", SqlDbType.Int));//总页数
- sp2.Direction = ParameterDirection.Output;
- #endregion
- cmd.Connection = conn;
- SqlDataReader dr = cmd.ExecuteReader();
- #region 注意此处不要用if,否则只能读出第一条数据
- //if (dr.Read()) // 注意此处不要用if,否则只能读出第一条数据
- //{
- // tb.Rows.Add(dr["id"].ToString(), dr["name"].ToString(), dr["class"].ToString());
- //}
- #endregion
- while (dr.Read())
- {
- tb.Rows.Add(dr["id"], dr["name"].ToString(), dr["class"].ToString());//插入行数据
- }
- conn.Close();
- Object obj = cmd.Parameters["@totalPageCount"].Value;
- if (obj != DBNull.Value)
- totalPageCount = Convert.ToInt32(obj); //获取输出参数 (总页数)
- Object oj = cmd.Parameters["@totalCount"].Value;
- totalCount = Convert.ToInt32(oj); //获取输出参数(总记录条数)
- tableString= getHtmlTable(tb);// 将获取的表数据格式化拼接
- }
- private string getHtmlTable(DataTable tb)
- {
- StringBuilder sb = new StringBuilder();
- sb.Append("<table><tr><th>姓名</th><th>班级</th></tr>");
- foreach (DataRow dr in tb.Rows)
- {
- sb.Append("<tr><td>");
- sb.Append(dr["name"]);// 获取某列数据 dr["列名"]
- sb.Append("</td><td>");
- sb.Append(dr["class"]);
- sb.Append("</td></tr>");
- }
- sb.Append("</table>");
- return sb.ToString();
- }
- protected void lbtnFirst_Click(object sender, EventArgs e)
- {
- Session["pageIndex"] = 1;
- BindRepeater();
- }
- protected void lbtnPre_Click(object sender, EventArgs e)
- {
- if (Convert.ToInt32(Session["pageIndex"]) > 1)
- Session["pageIndex"] = Convert.ToInt32(Session["pageIndex"]) - 1;
- else
- Session["pageIndex"] = 1; //当前已是第一页
- BindRepeater();
- }
- protected void lbtnNext_Click(object sender, EventArgs e)
- {
- if (Convert.ToInt32(Session["pageIndex"]) < totalPageCount)
- Session["pageIndex"] = Convert.ToInt32(Session["pageIndex"]) + 1;
- else
- Session["pageIndex"] = totalPageCount; //当前已是最后一页
- BindRepeater();
- }
- protected void lbtnLast_Click(object sender, EventArgs e)
- {
- Session["pageIndex"] = totalPageCount;
- BindRepeater();
- }
- }