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 - )*@pageSize +
set @endIndex = @pageIndex * @pageSize
--执行sql语句
select * from (select *,ROW_NUMBER() over(order by Paid)as row from BlogPhotoAlblum where PaIsDel=) as t where t.row>=@startIndex and t.row<=@endIndex --给输出参数赋值
select @totalCount = COUNT(*)from BlogPhotoAlblum where PaIsDel=
END
那么在DAL层如何调用这个存储过程了?
在DAL层执行的代码如下:需要返回list集合才方便序列化为Json对象,
a)如果参数中含有out 参数或者是构造函数的返回值,需要注意输出第三个参数的类型,
b)注意调用的方法为 RunProcedure
public List<BlogPhotoAlblum> GetAlblumByPage(int pageIndex, int pageSize, out int totalCount)
{
totalCount = ;
SqlParameter[] parameters = {
new SqlParameter("@pageIndex", pageIndex),
new SqlParameter("@pageSize", pageSize),
new SqlParameter("@totalCount",totalCount )
};
//设置第三个参数的类型
parameters[].Direction = System.Data.ParameterDirection.Output;
DataTable dt = DbHelperSQL.RunProcedure("[USP_GetAlbumByPage]", parameters, "de").Tables[];
//给第三个参数赋值
totalCount = Convert.ToInt32(parameters[].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 = ; 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 - )*@pageSize +
set @endIndex = @pageIndex * @pageSize
--执行sql语句
select * from (select *,ROW_NUMBER() over(order by Paid)as row from BlogPhotoAlblum where PaIsDel=) as t where t.row>=@startIndex and t.row<=@endIndex --给输出参数赋值
select @totalCount = COUNT(*)from BlogPhotoAlblum where PaIsDel=
END
三、关于分页存储过程的一些扩展
首先是SQL语句:
select * from (select *,ROW_NUMBER() over(order by Paid)as row from BlogPhotoAlblum where PaIsDel=) as t where t.row>=@startIndex and t.row<=@endIndex
这里采用了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
asp.net中分页与存储过程的一些总结的更多相关文章
- asp.net中怎样调用存储过程和存储过程的写法(转载,留着自己看)
asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varch ...
- asp.net中C#调用存储过程
创建存储过程: create procedure houseCount ( ), @house_count int output ) as select @house_count=COUNT(*) f ...
- Asp.Net中的三种分页方式
Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...
- Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值
Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...
- MySQL 存储过程中分页
MySQL数据库中,自定义存储过程查询表中的数据,带有分页功能.具体实例如下代码: 1 DROP PROCEDURE IF EXISTS `sampledb`.`proc_GetPagedDataSe ...
- 在asp.net中执行存储过程(转)
摘自:http://www.cnblogs.com/smhy8187/articles/677742.html 声明:本例用的数据库是系统提供的pubs数据库,表是是employee,编程语言用C# ...
- ASP.NET中无刷新分页
上次介绍了我们代码写的刷新分页,这次就来说说无刷新分页. 这次我们是在上次的基础上改动了一些,我们都知道想要无刷新,就需要Ajax,在我们的ASP.NET中AJax是和一般处理程序配合着用的. 无刷新 ...
- ASP.NET中刷新分页
1,第一次全部把数据加载到内存中,然后再做分页,性能差,不推荐. 2,GridView自带分页 3,AspNetPager分页控件 这个是第三分控件需要下载,很好用 4,自己写分页 前三种就不介绍如 ...
- ASP.NET中调用存储过程方法
两种不同的存储过程调用方法 为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法.另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明.本文所 ...
随机推荐
- cursor详解
源地址:http://www.cnblogs.com/jiewoyishengwzm/archive/2010/06/08/1754232.html 查询 SELECT语句用于从数据库中查询数据,当在 ...
- 20145305 《Java程序设计》第10周学习总结
学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据时, ...
- Ext.Form 自动填写表单内容
前台: 表单必须含有name属性 if (action == 'edit' || action == 'show') { MyForm1.getForm().load({ url: '/data/cu ...
- c++cin.ignore()
c++ 中cin.ignore(100,'\n'); 的作用是清除输入流中多余的字符请问这句话是什么意思? 可以举个例子吗? 提问者采纳 这个其实就是忽略cin中的前100个字符,或是'\n'之前的字 ...
- WayPoint寻路
寻路在游戏开发中的重要性,不用多说了.从大型ARPG游戏到小规模体验游戏,都会不同程度的用到寻路功能. 塔防类游戏,战棋类游戏经常用到waypoint(路径)寻路. 下面我们来介绍一下waypoint ...
- StrictMode对SharedPreferences的检查出来的IO操作
在使用StrictMode时,发现会爆出 StrictMode policy violation;~duration=1949 ms: android.os.StrictMode$StrictMode ...
- UIPickView 和 UIDatePicker
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- UVA12653 Buses
Problem HBusesFile: buses.[c|cpp|java]Programming competitions usually require infrastructure and or ...
- WEB 安全之 SQL注入 < 二 > 暴库
SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...
- [ CodeVS冲杯之路 ] P1053
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...