本文来自 CSDN 博客 作者:Cici Cheng
在前三节中探讨了假分页,假分页最大的弊端就是从数据库服务器取出了很多数据,却只是显示其中的一小部分,以此为例,每次页面加载时,IIS服务器都会从SQLSERVER数据库服务器提取3144条数据,而实际上却只有10条呈现给了用户,这样极大的浪费了服务器资源。从这一节开始我们来探讨真分页,真分页也就是只取需要显示的数据,比如每页显示10条,那就只从数据库服务器取出10条,然后予以呈现,这样就极大的节约了系统资源,这种分页在当今IT市场上极为通用的一种用法。
要达到此目的,就需要先获取当前查询条件下能获取的总的数据条数,然后再告诉服务器我要去那条到那条,也就是开始行的索引(startIndex)和结束行的索引(endIndex),在SQLSERVER数据库中无法动态设定行号(也就是数据行的索引)的取值范围,所以这里就必须要使用存储过程或者自定义函数。而在ORACLE数据库中有一个伪列的概念,即ROWNUM,其实也就是查询结果集数据行的索引,所以在ORACLE中只通过查询语句便可实现真分页。
在SQLSERVER 2005中提供了一个在2000中没有的函数 -- -- row_number(),这个函数可以获取数据结果集行的索引。
1)在SQLSERVER中处理分页,必须使用存储过程或自定义函数
--通过开始行和结束行的索引获取结果集的存储过程 create procedure sp_Paging_GetCounty @startIndex int, @endIndex int as with table_temp as (select row_number() over(order by o_id) as rowIndex,* from County) select * from table_temp where rowIndex between @startIndex and @endIndex go
--通过开始行和结束行的索引获取结果集的函数 create function ft_Paging_GetCounty(@startIndex int,@endIndex int) returns table as return(with table_temp as (select row_number() over(order by o_id) as rowIndex,* from County) select * from table_temp where rowIndex between @startIndex and @endIndex) go
--获取所有符合查询条件的结果集的总行数 select count(*) from County
执行以下操作时
exec sp_Paging_GetCounty 1,12 select * from ft_Paging_GetCounty(1,5) select count(*) from County
测试结果如下:
2)在ORACLE中处理分页则相对简单,只需要两个查询即可
--通过开始行和结束行的索引获取结果集 select rownum,* from County where rownum between 1 and 8 --获取所有符合查询条件的结果集的总行数 select count(*) from County
和第二节中的自定义假分页相似,这里只是获取分页显示数据集的方式有所区别,真分页是按需获取,假分页则是获取所有然后再进行筛选。实例源码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs" Inherits="Default4" %> <!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 id="Head1" runat="server"> <title>ASP.NET分页之自定义存储过程分页(真分页)</title> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="o_id" Width="400px"> <Columns> <asp:BoundField DataField="rowIndex" HeaderText="行索引" SortExpression="rowIndex" ReadOnly="True" /> <asp:BoundField DataField="o_id" HeaderText="编号" SortExpression="o_id" ReadOnly="True" /> <asp:BoundField DataField="o_name" HeaderText="区县" SortExpression="o_name" /> <asp:BoundField DataField="c_id" HeaderText="市编号" SortExpression="c_id" /> </Columns> </asp:GridView> <br /> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td> 共<asp:Label ID="lblPageCount" runat="server" ForeColor="Red"></asp:Label>页, 当前第<asp:Label ID="lblCurrPage" runat="server" ForeColor="Red"></asp:Label>页 共<asp:Label ID="lblTotalCount" runat="server" ForeColor="Red"></asp:Label>条记录, 每页显示<asp:Label ID="lblPageSize" runat="server" Text="12" ForeColor="Red"></asp:Label>条 </td> <td> <asp:LinkButton ID="btnFirst" runat="server" OnClick="btnFirst_Click">首页</asp:LinkButton> <asp:LinkButton ID="btnPrev" runat="server" OnClick="btnPrev_Click">上一页</asp:LinkButton> <asp:LinkButton ID="btnNext" runat="server" OnClick="btnNext_Click">下一页</asp:LinkButton> <asp:LinkButton ID="btnLast" runat="server" OnClick="btnLast_Click">尾页</asp:LinkButton> 跳到<asp:DropDownList ID="ddlPager" runat="server" Width="50" OnSelectedIndexChanged="ddlPager_SelectedIndexChanged" AutoPostBack="true" /> 页 </td> </tr> </table> </form> </body> </html>
示例后台代码如下:
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; public partial class Default4 : System.Web.UI.Page { //页面加载时默认显示第一页 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindPaging("1"); } } //首页按钮被点击 protected void btnFirst_Click(object sender, EventArgs e) { BindPaging("1"); } //上一页页按钮被点击 protected void btnPrev_Click(object sender, EventArgs e) { BindPaging("-1"); } //下一页页按钮被点击 protected void btnNext_Click(object sender, EventArgs e) { BindPaging("+1"); } //尾页按钮被点击 protected void btnLast_Click(object sender, EventArgs e) { BindPaging("0"); } //下拉列表框选项发生改变 protected void ddlPager_SelectedIndexChanged(object sender, EventArgs e) { BindPaging(ddlPager.Text); } private void BindPaging(string page) { SqlDataSource sqlds = new SqlDataSource(); sqlds.ConnectionString = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; sqlds.SelectCommand = "SELECT count(*) FROM [County]"; sqlds.SelectCommandType = SqlDataSourceCommandType.Text; DataView dv = sqlds.Select(DataSourceSelectArguments.Empty) as DataView; int totalCount = int.Parse(dv[0][0].ToString());//总条数 int pageSize = 12;//每页显示条数 int pageCount = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1);//总页数 int currPage; //当前页数 //设置当前页 switch (page) { //首页 case "1": currPage = 1; break; //下一页 case "+1": currPage = int.Parse(lblCurrPage.Text) + 1; break; //上一页 case "-1": currPage = int.Parse(lblCurrPage.Text) - 1; break; //尾页 case "0": currPage = pageCount; break; //下拉列表框直接传值时 default: currPage = int.Parse(page); break; } //加载DropDownList项 if (!IsPostBack) { for (int i = 1; i <= pageCount; i++) { ddlPager.Items.Add(i.ToString()); } } //设置分页信息的显示 lblCurrPage.Text = currPage.ToString(); lblPageCount.Text = pageCount.ToString(); lblPageSize.Text = pageSize.ToString(); lblTotalCount.Text = totalCount.ToString(); //设置翻页按钮的可用性 btnFirst.Enabled = btnPrev.Enabled = btnNext.Enabled = btnLast.Enabled = true; if (currPage == 1) { btnFirst.Enabled = btnPrev.Enabled = false; } if (currPage == pageCount) { btnNext.Enabled = btnLast.Enabled = false; } ddlPager.Text = currPage.ToString(); //通过开始行和结束行的索引获取当前页要显示的数据集 sqlds.SelectCommand = "sp_Paging_GetCounty"; sqlds.SelectParameters.Add("startIndex", ((currPage - 1) * pageSize + 1).ToString()); sqlds.SelectParameters.Add("endIndex", (currPage * pageSize).ToString()); sqlds.SelectCommandType = SqlDataSourceCommandType.StoredProcedure; dv = sqlds.Select(DataSourceSelectArguments.Empty) as DataView; GridView1.DataSource = dv; GridView1.DataBind(); } }
运行效果如下:
在这一节中已经详细介绍了ASP.NET中的真分页,这种分页方式可以进行相应的扩充,以达到自己的需求,也可以添加一些查询条件,必须注意的是,若加查询条件,则存储过程和查询总记录条数的查询语句必须具备相同的查询条件
相关推荐
在Asp.Net开发中,分页和自定义控件是两个关键的概念,它们极大地提高了Web应用的性能和用户体验。下面将详细阐述这两个知识点。 一、Asp.Net分页 Asp.Net分页是一种用于处理大量数据的技术,它可以将大数据集分割...
本文将深入探讨如何在ASP.NET中实现自定义分页,以及与SQL数据库的集成。 首先,我们要理解ASP.NET中的分页原理。分页的基本思想是通过在服务器端对数据进行切割,每次只取一部分数据返回给客户端,然后在客户端...
.NET框架提供了一些内置的分页控件,如ASP.NET中的GridView和DataGrid,但这些控件可能无法满足开发者对于外观、功能或性能的特殊需求,因此,自定义分页控件的需求应运而生。 创建自定义分页控件涉及以下几个关键...
在ASP.NET中,分页控件是处理大数据集时不可或缺的组件,它能有效地提高用户体验,避免一次性加载大量数据导致的页面响应慢或内存消耗过大的问题。 标题中的“asp.net分页控件”指的是用于在网页上实现数据分页显示...
Asp.net 高效的分页存储过程,已通过测试.
在这个“asp.net24种分页含源码”的资源包中,我们重点关注的是ASP.NET中的分页技术,这是一种在处理大量数据时不可或缺的功能,可以提高网页加载速度,提升用户体验。 分页是Web应用中常见的数据展示策略,特别是...
asp.net分页控件asp.net分页控件
- **存储过程**:为了优化性能,可以创建存储过程来处理分页逻辑,减少对数据库的多次访问。 - **Entity Framework或ADO.NET**:作为数据访问层,用于与数据库交互,获取分页数据。 - **View State或Session**:用于...
### C# ASP.NET 自定义分页控件解析 #### 概述 在Web开发中,分页是一项常用的功能,尤其当需要展示大量数据时。本文将深入探讨如何使用C#和ASP.NET创建自定义的分页控件。通过分析提供的`Pager.cs`源代码,我们将...
一个自定义的ASP.NET分页类通常包括以下核心组件和功能: 1. **数据获取**:分页类首先需要能从数据源(如SQL Server数据库、XML文件、Web服务等)中获取数据。这通常通过ADO.NET或者Entity Framework等数据访问...
基于ASP.NET的自定义分页显示及可拖动改变列宽代码 支持通过Url进行分页,支持Url分页方式下的Url重写(UrlRewrite)功能,支持使用用户自定义图片做为导航元素,功能强大灵活、使用方便、可定制性强,增强的 Visual...
本篇文章将详细探讨ASP.NET中如何利用存储过程实现高效的数据分页。 一、理解分页 分页是将大量数据分割成多个小部分(页)来展示,让用户可以逐页浏览,而不是一次性加载所有内容。这不仅减少了页面加载时间,还...
这个“一个不错的Asp.net分页控件”很可能是开发者为了优化用户体验和提高网页性能而设计的自定义控件。 在Asp.Net框架中,分页功能通常是通过GridView、ListView或者Repeater等数据绑定控件来实现的。这些控件内置...
本文将深入探讨.NET分页和ASP.NET分页的相关知识点,以及如何在实际项目中应用。 首先,我们来理解什么是分页。分页是将大量数据分成多个小部分,每次只显示一部分,用户可以通过导航按钮(如“上一页”、“下一页...
在这个特定的场景中,我们关注的是"ASP.NET分页控件源码",它是为了帮助开发者在网页上实现高效、用户友好的数据浏览功能。 分页控件是ASP.NET Web Forms中常见的一种组件,它主要用于处理大量数据时,以防止一次性...
Webdiyer 提供的 AspNetPager 是一个功能丰富的 ASP.NET 分页控件,提供了多种自定义样式和功能选项,以适应不同网页设计的需求。 在上述描述中,我们可以看到三个不同样式的 AspNetPager 控件实例: 1. **样式一*...
asp.net分页第三方控件 非常好用 grideView,datalist等绑定