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数据库上,其它情况类似,以后不再一一说明.本文所 ...
随机推荐
- 如何构建日均千万PV Web站点
http://www.cnblogs.com/xiaocen/p/3723839.html http://www.cnblogs.com/xiaocen/p/3726763.html http://w ...
- C++学习25 纯虚函数和抽象类
在C++中,可以将成员函数声明为纯虚函数,语法格式为: ; 纯虚函数没有函数体,只有函数声明,在虚函数声明结尾加上=0,表明此函数为纯虚函数. 最后的=0并不表示函数返回值为0,它只起形式上的作用,告 ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- Android SDK Manager 设置代理
直接启用 Android SDK Manager 的命令如下: 在SDK 的 tools 目录下执行: ./android sdk 就会进入 Android SDK Manager 设置代理 在 ...
- [SQL]循环插入数据,并且计算插入所用时间
--得出以上速度的方法是:在各个select语句前加: declare @d datetime set @d=getdate() select * from tb --并在select语句后加: se ...
- 如何让Form窗体接收KeyDown事件?
在使用.Net Framework编写窗体应用程序的时候,有时有需要响应窗体的按键消息.当窗体上没有任何其他控件的时候,窗体是可以直接响应这些消息的. 但是当窗体上有其他控件时,会发现窗体再也不会响应 ...
- (转)winform post 访问网站
最近使用winform对webapi进行测试,搜集到园友的文章,记录下来供后续参考. 第一篇文章,原文地址http://www.cnblogs.com/Johnny_Z/archive/2012/02 ...
- 临时改GCC编译器,重启后失效
临时改GCC编译器,重启后失效.例如,用如下命令: export CROSS_COMPILE= <gcc 文件所在的目录>/arm-linux-gnueabihf- 本例中使用的命令如下: ...
- 使用 Cocos2d-x 3.1.1 创建 Windows Phone 8 游戏开发环境
cocos2d-x 是目前流行的游戏游戏开发框架,目前最新的版本是 3.1.1, 网上有些教程已经比较老了,本文将会介绍如何使用最新的 3.1.1 创建 Windows Phone 8 开发环境. 本 ...
- HttpWebRequest访问时,错误:(401)未经授权。
HttpWebRequest访问时,错误:(401)未经授权. 某网页,我不想做登录界面,直接使用域的帐号密码来访问.如果网站设置成Window身份验证,单独的页面都没问题,而是通过使用HttpWeb ...