asp.net中分页与存储过程的一些总结

一、接上文,使用的是jquery AJAX 进行分页

分页存储过程代码如下:

ALTER PROCEDURE [dbo].[USP_GetAlbumByPage]
        @pageIndex int,--当前页
        @pageSize int,--页容量
        @totalCount int out--数据的总条数
    AS
    BEGIN
         --定义开始和结束的下标
        Declare @startIndex int,@endIndex int
        set @startIndex = (@pageIndex - 1 )*@pageSize + 1
        set @endIndex = @pageIndex * @pageSize
        --执行sql语句
        select * from (select *,ROW_NUMBER() over(order by Paid)as row from BlogPhotoAlblum where PaIsDel=0) as t where t.row>[email protected] and t.row<=@endIndex

        --给输出参数赋值
        select @totalCount = COUNT(*)from BlogPhotoAlblum where PaIsDel=0
    END

那么在DAL层如何调用这个存储过程了?

在DAL层执行的代码如下:需要返回list集合才方便序列化为Json对象,
a)如果参数中含有out 参数或者是构造函数的返回值,需要注意输出第三个参数的类型,
b)注意调用的方法为 RunProcedure

    public List<BlogPhotoAlblum> GetAlblumByPage(int pageIndex, int pageSize, out int totalCount)
        {
            totalCount = 0;
            SqlParameter[] parameters = {
                    new SqlParameter("@pageIndex", pageIndex),
                    new SqlParameter("@pageSize", pageSize),
                    new SqlParameter("@totalCount",totalCount )
                    };
            //设置第三个参数的类型
            parameters[2].Direction = System.Data.ParameterDirection.Output;
            DataTable dt = DbHelperSQL.RunProcedure("[USP_GetAlbumByPage]", parameters, "de").Tables[0];
            //给第三个参数赋值
            totalCount = Convert.ToInt32(parameters[2].Value);

            //DataSet s = new DataSet();
            //DataTable dt = new DataTable();
            //dt.DefaultView.Table.DefaultView.Table

            //将dt转成List集合,这里很关键,因为json对象返回的值的对象不能循环
            //创建一个集合对象
            List<BlogPhotoAlblum> list = new List<BlogPhotoAlblum>();
            foreach (DataRow row in dt.Rows)
            {
                if (row != null)
                {
                    //this既可以调用自己的方法,也可以调用父类的方法
                    //base只能调用父类的方法
                    BlogPhotoAlblum model = this.DataRowToModel(row);
                    list.Add(model);
                }
            }
            return list;
        }
    

二、使用 AspNetPager 分页控件

前端除了使用JQuery插件实现分页外,还可使用使用 AspNetPager 分页控件。

要使用 AspNetPager 分页控件,必须最少指定它的 RecordCount 属性的值,另外如果需要,指定并编写 PageChanging 或 PageChanged 事件的处理程序,可以在PageChanging事件处理程序中取消分页事件,在PageChanged事件处理程序中绑定数据或实现自定义的数据呈现逻辑。 RecordCount 属性指定要分页的所有数据的总项数,若未指定该值或该值小于等于 PageSize ,即要分页的数据只有一页,则AspNetPager控件默认会自动隐藏而不显示任何内容,若需在只有一页数据的情况下显示AspNetPager分页控件,可以将它的AlwaysShow属性设为true即可。

示例如下:

<form id="form1" runat="server">
<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
<ItemTemplate>
<div class="albDiv">
<ul>
<li>
<img src="/upload/img/<%#Eval("PSrc") %>" />
</li>
<li><%#Eval("PTitle") %></li>
<li>
<asp:LinkButton CommandName="Del" CommandArgument=‘<%#Eval("PId") %>‘ ID="LinkButton1" runat="server">删除</asp:LinkButton>
|
<a href="/0906/Edit.aspx?id=<%#Eval("PId") %>&albId=<%#Eval("PAlbum") %>">修改</a> |
<a href="/0906/Update.aspx?id=<%#Eval("PId") %>&albId=<%#Eval("PAlbum") %>">上传图片</a>
</li>
</ul>
</div>
</ItemTemplate>

</asp:Repeater>

</form>

后台cs代码:

protected void Page_Load(object sender, EventArgs e)
{
BindData();
}

private void BindData()
{
//得到一些数据
//获取或设置分页控件的当前页的索引
int pageIndex = this.AspNetPager1.CurrentPageIndex;
//获取或设置每页显示的项数
int pageSize = this.AspNetPager1.PageSize;
int totalCount = 0;

List<BlogPhoto> list = bll.GetBlogPhotoList(int.Parse(albId), pageIndex, pageSize, out totalCount);

//一定要指定 RecordCount属性,记录总页数
this.AspNetPager1.RecordCount = totalCount;

//绑定数据,前台界面中的<%#Eval("PId") %> 的数据源就是在这里获得的
Repeater1.DataSource = list;
Repeater1.DataBind();
}

protected void AspNetPager1_PageChanging(object src, Wuqi.Webdiyer.PageChangingEventArgs e)
{
//NewPageIndex 获取用户在 AspNetPager 控件的页选择元素中选定的或在页索引文本框中手工输入的页的索引。
int pageIndex = e.NewPageIndex;
//从e中获取最新的当前页面
this.AspNetPager1.CurrentPageIndex = pageIndex;
//从新绑定一下
BindData();
}

分页存储过程代码如下:

ALTER PROCEDURE [dbo].[USP_GetAlbumByPage]
        @pageIndex int,--当前页
        @pageSize int,--页容量
        @totalCount int out--数据的总条数
    AS
    BEGIN
         --定义开始和结束的下标
        Declare @startIndex int,@endIndex int
        set @startIndex = (@pageIndex - 1 )*@pageSize + 1
        set @endIndex = @pageIndex * @pageSize
        --执行sql语句
        select * from (select *,ROW_NUMBER() over(order by Paid)as row from BlogPhotoAlblum where PaIsDel=0) as t where t.row>[email protected] and t.row<=@endIndex

        --给输出参数赋值
        select @totalCount = COUNT(*)from BlogPhotoAlblum where PaIsDel=0
    END

三、关于分页存储过程的一些扩展

首先是SQL语句:

select * from (select *,ROW_NUMBER() over(order by Paid)as row from BlogPhotoAlblum where PaIsDel=0) as t where t.row>[email protected] and t.row<[email protected]

这里采用了ROW_NUMBER()函数,

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。
示例:
xlh row_num
1700 1
1500 2
1085 3
710 4

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

实例:

初始化数据

create table employee (empid int ,deptid int ,salary decimal(10,2))
insert into employee values(1,10,5500.00)
insert into employee values(2,10,4500.00)
insert into employee values(3,20,1900.00)
insert into employee values(4,20,4800.00)
insert into employee values(5,40,6500.00)
insert into employee values(6,40,14500.00)
insert into employee values(7,40,44500.00)
insert into employee values(8,50,6500.00)
insert into employee values(9,50,7500.00)

数据显示为

empid deptid salary
----------- ----------- ---------------------------------------
1 10 5500.00
2 10 4500.00
3 20 1900.00
4 20 4800.00
5 40 6500.00
6 40 14500.00
7 40 44500.00
8 50 6500.00
9 50 7500.00

需求:根据部门分组,显示每个部门的工资等级

预期结果:

empid deptid salary rank
----------- ----------- --------------------------------------- --------------------
1 10 5500.00 1
2 10 4500.00 2
4 20 4800.00 1
3 20 1900.00 2
7 40 44500.00 1
6 40 14500.00 2
5 40 6500.00 3
9 50 7500.00 1
8 50 6500.00 2

SQL脚本:

SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee
时间: 2024-11-08 18:59:50

asp.net中分页与存储过程的一些总结的相关文章

ASP.NET中分页显示

分页详解,ASP.NET书本  "数据空间应用" (1)使用GridView控件分页显示 步奏:1.添加GridView控件 2.将GrideView控件的AllowPaging属性设置为True,表示允许分页  3.将PageSize属性设置一个数字,用来控制每页中显示的记录数 4.最后在GridView控件的PageIndexChanging事件中设置GridView控件的PageIndex属性为当前页的索引值,并重新绑定GridView控件 (2)DataList控件中的数据 u

asp.net中怎样调用存储过程和存储过程的写法(转载,留着自己看)

asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varchar(100)as select * from loginuser where name like @name ---创建一个有输入和输出参数的存储过程 create procedure proc_usertext@name varchar(20),@blog varchar(100) output

ASP.NET中的几种分页

1.通过DataGrid控件实现分页 ASP.NET中的DataGrid控件自带了分页功能,当绑定了DataGrid的数据源之后,须要对DataGrid控件进行一些设置: 左击控件右上角的小箭头→属性生成器: 选择左边的[分页]选项卡 选中[同意分页].[页大小]表示一页显示多少条数据:导航button的[位置]有顶.底.上下型三种选择.[模式]有页码和"上一页.下一页button".假设选择了页码模式.[数值button]表示最多显示的button数量,假设选择了还有一种模式,&qu

ASP.NET中利用DataGrid的自定义分页功能

ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页 ASP.Net中的DataGrid有内置分页功能, 但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页, 这种只选取了一小部分而丢掉大部分的方法是不可去取的. 在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现分页. 下面介绍一下我在项目中用到的分页

ASP.NET中ListView用DataPager分页

最近在维护一个以前的项目,项目中用到ListView,在ListView的分页中用的是DataPager.最开始我将数据绑定放到了Page_Load事件中,数据的加载等都很正常,显示也没有问题,就是在点击分页按钮的时候分页总是不正确,这个问题困扰了我几天,期间我也想换用AspNetPager分页控件,在一次偶然的机会我搜索到ListView结合DataPager分页,其中关键的一句: 注意:使用本方法,不需要在页面的Page_Load事件中绑定数据到ListView控件,否则分页会有问题. 我将

Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值

Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能自动生成映射文件. 不能自动生成那就自己写一张表跟存储过程返回的那张表一样就行.然后拖拽至dbml中,然后设置属性中返回类型为这张表就行了.

ASP.NET中实现Ajax分页

在页面中指定一个div容器来接收动态生成的分页数据: 1 <div id="div_menu"> 2 </div> 使用jQuery来请求并处理Json格式数据: 1 //定义页码与页容量 2 var pageIndex = 1; 3 var pageSize = 15; 4 var pageCount = 0; 5 var recordCount = 0; 6 AjaxGetData(pageIndex, pageSize); 7 //Ajax获取数据 8 f

MySQL 存储过程中分页

2014-11-20 MySQL数据库中,自定义存储过程查询表中的数据,带有分页功能.具体实例如下代码: 1 DROP PROCEDURE IF EXISTS `sampledb`.`proc_GetPagedDataSet`; 2 3 CREATE DEFINER=`root`@`%` PROCEDURE `proc_GetPagedDataSet`( 4 IN tableName VARCHAR (20), /*表名 5 IN pageIndex INT, /*当前页*/ 6 IN page

ASP.NET中DataList数字分页代码

ASP.NET中DataList数字分页代码 转 荐 好长时间没发东西了, 之前一段时间一直在做别的东西, 最近java实验室要开搞系统哈哈, 重新学习.net 这个分页困扰了我这个菜鸟好久阿, 搞了好久终于找到这段代码, 还是数字分页, 试了成功了~还不会分页的朋友看到这个就偷笑吧~~ 代码转自http://hi.baidu.com/honfei css样式取自吴旗娃aspnetpager 效果: 共1页       首页 上一页  1 2 3 4 5 6 7 8 9 10 ....下一页 末