`
sony-soft
  • 浏览: 1019387 次
文章分类
社区版块
存档分类
最新评论

SQL分页的存储过程详解

 
阅读更多
ASP.Net中的DataGrid有内置分页功能, 但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页, 这种只选取了一小部分而丢掉大部分的方法是不可去取的.

在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现分页. 下面介绍一下我在项目中用到的分页方法.

当然显示控件还是用DataGrid的, 因为数据绑定很方便^_^.

要保证不传输冗余的数据,那么必须在数据库中数据读取时实现分页, 数据库的分页操作可以放在存储过程中. 看了CSDN的一篇Blog中讲了一个百万级数据分页的存储过程的实现(http://blog.csdn.net/wellknow/posts/55167.aspx,他的这个方法可以根据不同情况进行适当的优化), 根据他的方法,这里实现一个简单的SQL语句来实现这里分页需要的存储过程。

create procedure ListProduct

(

@PageIndex int, -- 分页后需要页的序号

@PageSize int, -- 一页的大小

@ConditionSQL – 查询条件的SQL语句

)

AS … 具体代码就不写了(可以参考上面的链接).



具体的SQL语句如下:

SELECT TOP 100 * FROM (select * from product where productid<200000) T WHERE T.productid NOT IN

(SELECT TOP 900 productid FROM (select productid from product where productid<200000) T1 ORDER BY T1.productid asc) ORDER BY productid asc

这条语句的 从总的商品(30万)中取出productid<200000(共20万),再按每页100的大小分页,然后取出第10页.



Public DataTable ListProduct(int pageIndex, int pageSize)

{

//ADO.net从数据库中取出数据的代码就略过^_^.

}





用上面的存储过程读出的数据在DataGrid里面分页, 必须把DataGrid的AllowPaging和AllowCustomPaging设置为true

protected System.Web.UI.WebControls.DataGrid ProductGrid;

ProductGrid.AllowPaging = true;

ProductGrid.AllowCustomPaging = true;



然后在设置要显示的一页的大小

ProductGrid.PageSize = 100; // 在显示的时候依据实际的数据显示。

设置一页大小后,如果要让DataGrid实际分出页数来,还必须设置

ProductGrid.VirtualItemCount = GetProductCount() ; // GetProductCount() 的功能是获取满足条件的产品数目, 这里的条件就是productid<200000. 设置这项属性后,那么这个DataGrid的页数就是

VirtualItemCount/PageSize, 也就是PageCount的值. 不能对PageCount直接赋值,因为他是只读的属性.

这些属性设置好后再绑定数据:

ProductGrid.DataSource = ListProduct(1, ProductGrid.PageSize); // 在Page_Load里面 pageIndex为1,记住判断IsPostBack,在IsPostBack为false时执行这些代码

ProductGrid.DataBind();



这样数据绑定后就可以看到具有分页模样的页面了.但是还不能真正的分页.要实现真正的分页,还必须实现下面的功能.



处理DataGrid的PageIndexChanged事件(处理用户新选中某页时的事件)

private void ProductGrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)

{

// 如果在存储过程分页功能中用1表示第一页的序号的话那么这里必须用e.NewPageIndex+1作为pageIndex(如果选择了DataGrid上页号为3的页,那么e.NewPageIndex就为2), 否则的话直接用e.NewPageIndex就可以了

ProductGrid.DataSource = ListProduct(e.NewPageIndex+1, ProductGrid.PageSize); // 从数据库中读取新的数据

ProductGrid.DataBind();

// 设置当前的Page序号值, 如果不设置的话它是不会变得, 这样会给用户造成误解,以为所有页的数据相同。

ProductGrid.CurrentPageIndex =e.NewPageIndex;

}



如果你处理了DataGrid的ItemCommand的事件的话,必须在ItemCommand事件处理代码前面加上这些代码:

if (e.Item.ItemType == ListItemType.Pager)

{

return;

}

因为当PageIndexChanged事件激发,也就是用户选则了另外一页时会先激发ItemCommand事件,如果不这样处理的话,可能会遇到一些意想不到的情况(如果你确实需要的话也可以上面这段代码,不过最好实际测试一下)。



整个过程完成后,再次浏览页面,觉得速度真是快多了。
分享到:
评论

相关推荐

    ASPNET存储过程自定义分页详解

    ASPNET存储过程自定义分页详解 京华志&精华志出品 分享资源 C# ASP.NET SQL DBA 源码

    深入sql server 2005 万能分页存储过程的详解

    本篇文章是对sqlserver2005中的万能分页存储过程进行了详细的分析介绍,需要的朋友参考下

    sql存储过程几个简单例子

    sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解。 例1: create proc proc_...

    asp.net中如何调用sql存储过程实现分页

    使用sql存储过程实现分页,在网上能找到好多种解决方案,但是如何用asp.net后台调用呢,通过本篇文章小编给大家详解asp.net中如何调用sql存储过程实现分页,有需要的朋友可以来参考下

    mysql存储过程 在动态SQL内获取返回值的方法详解

    MySql通用分页存储过程过程参数 代码如下:p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int,out p_recordcount int,out p_pagecount int...

    MVC分页详解(包括整个流程步骤,代码与注解)

    1、首先写一个Model分页模型MvcPagerInfo.cs(可放入AppCode中) 2、在控制器公用方法中添加分页方法BaseController.cs...8、单纯SQL语句分页,当然你也可以用存储过程进行分页 9、结果http://localhost:XXXX/Admin/View中

    深入mysql存储过程中表名使用参数传入的详解

    BEGIN declare date_str varchar(8);declare table_prefix varchar(20);set table_prefix=’mail_rare_visit_’;set date_str = DATE_FORMAT(CURRENT_DATE(),’%Y%m%d’);set @table_name = concat(table_prefix, ...

    MVC分页详解(包括整个流程代码与注解)

    1、首先写一个Model分页模型MvcPagerInfo.cs可放入AppCode中 2、在控制器公用方法中添加分页方法BaseController.cs 3、写一个一般处理程序Pageras.cx ...8、单纯SQL语句分页当然你也可以用存储过程进行分页

    asp.net知识库

    可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) 常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! ...

    hibernate 框架详解

    使用存储过程的规则和限制 17.4. 定制SQL用来create,update和delete 17.5. 定制装载SQL 18. 过滤数据 18.1. Hibernate 过滤器(filters) 19. XML映射 19.1. 用XML数据进行工作 19.1.1. 指定同时映射XML...

    低清版 大型门户网站是这样炼成的.pdf

    5.12 hibernate调用存储过程 343 5.13 xml数据持久化 346 5.14 小结 348 第6章 充分利用spring 2.5的ioc利器统管bean世界 349 6.1 java程序员的春天厚礼—spring 2.5 349 6.1.1 爱上spring 2.5的十大理由 350 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

    mysql 循环批量插入的实例代码详解

    前几天在MySql上做分页时,看到有博文说使用 limit 0,10 方式分页会有丢数据问题,有人又说不会,于是想自己测试一下。测试时没有数据,便安装了一个MySql,建了张表,在建了个while循环批量插入10W条测试数据的时候...

    3天从零快速搭建BI商业大数据分析平台视频教程

    手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 从0开始构建BI商业大数据分析平台,以实际的电商分析业务,贯穿数据生成,数据仓库、ETL、数据分析以及可视化...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

Global site tag (gtag.js) - Google Analytics