快捷搜索:

ASP.NET 2.0数据教程之二十五: 大数据量时提高分页

本文示例源代码或素材下载

如我们在之前的教程里评论争论的那样,分页可以经由过程两种措施来实现:

默认分页– 你仅仅只用选中data Web control的 智能标签的Enable Paging ; 然而,当你浏览页面的时刻,虽然你看到的只是一小部分数据,ObjectDataSource 照样会每次都读取所稀有据

自定义分页– 经由过程只从数据库读取用户必要浏览的那部分数据,前进了机能.显然这种措施必要你做更多的事情.

默认的分页功能异常吸惹人,由于你只必要选中一个checkbox就可以完成了.然则它每次都读取所有的数据,这种要领在大年夜数据量或者并发用户多的环境下就分歧适.在这样的环境下,我们必须经由过程自定义分页来使系统达到更好的机能.

自定义分页的一个重点是要写一个返回仅仅必要的数据的查询语句.幸运的,Microsoft SQL Server 2005 供给了一个新的keyword,经由过程它我们可以写出读取必要的数据的查询.在本教程里,我们将进修在GridView里若何应用Microsoft SQL Server 2005 的这个新的keyword来实现自定义分页.自定义分页和默认分页的界面看起来一样,然则当你从一页转到另一页时,在效率上差了几个数量级.

留意:自定义分页带来的机能提升法度榜样取决于数据的总量和数据库的负载.在本教程的着末我们会用数据来阐明自定义分页带来的机能方面的好处.

第一步: 理解自定义分页的历程给数据分页的时刻,页面显示的数据取决于哀求的是哪一页和每页显示若干条.比如,想象以下我们给81个product分页,每页显示10条.当我们浏览第一页时,我们必要的是product 1 到 product 10.当浏览第二页时,我们必要的是product 11 到 product 20,以次类推.

对付必要读取什么数据和分页的页面怎么显示,有三个相关的变量:

Start Row Index – 页面里显示数据的第一行的索引; 这个值可以经由过程页的索引乘每页显示的记录的条数加1获得. 例如, 假如一页显示10条数据, 那么对第一页来说(第一页的索引为0), 第一行的索引为0 * 10 + 1, or 1; 对第二页来说(索引为1), 第一行的索引为1 * 10 + 1,即 11.

Maximum Rows – 每页显示的最多记录的条数. 之以是称为“maximum” rows 是因为着末一页显示的数据可能会比page size要小. 比如, 当以每页10笔记录来显示81条时, 着末一页也便是第九页只包孕一笔记录. 没有页面显示的记录条数会大年夜于Maximum Rows 的值.

Total Record Count – 显示数据的总条数. 不必要知道页面显示什么数据,然则记录总数会影响到分页. 比如, 假如对81条product记录分页,每页10条,那么总页数为9.

对默认分页来说,Start Row Index是由页索引和每页的记录数加1获得,Maximum Rows 便是每页的记录数.应用默认分页时,不管是出现哪页的数据,都是要读取整个的数据,所有每行的索引都是已知的,这样获取Start Row Index变的没有代价.而且,记录的总条数是可以经由过程DataTable的总条数来获取的.

自定义分页只返回从Start Row Index 开始的Maximum Rows笔记录.在这里有两个要留意的地方:

我们必须把全部要分页的数据和一个row index关联起来,这样才能从指定的Start Row Index 开始返回必要的数据.

我们必要供给用来分页的数据的总条数.

在后面的两步里我们将写出和上面两点相关的SQL.除此之外,我们还将在DAL和BLL里完成响应的措施.

第二步: 返回必要分页的记录的总条数在我们进修若何返回显示页面必要的数据之前,我们先来看看怎么获取数据的总条数.由于在设置设置设备摆设摆设界面的时刻必要用到这个信息.我们应用SQL的COUNT aggregate function来实现这个.比如,返回Products表的总记录条数,我们可以用如下的语句:

SQL

1

2

SELECT COUNT(*)      FROM Products

我们在DAL里添加一个措施来返回这个信息.这个措施名为TotalNumberOfProducts() ,它会履行上面的SQL语句.

打开App_Code/DAL 文件夹里的 Northwind.xsd .然后在设计器里右键点ProductsTableAdapter ,选择Add Query.和我们在曩昔的教程里进修的那样,这样会容许我们添加一个新的DAL措施,这个措施被调用时会履行指定的SQL或存储历程.和前面的TableAdapter 措施一样,为这个添加一个SQL statement.

图 1:应用 SQL Statement

鄙人一个窗体我们可以指定创建哪种SQL .因为查询只返回一个值–Products表的总记录条数–我们选择“SELECT which returns a singe value”.

图 2:应用 SELECT Statement that Returns a Single Value来设置设置设备摆设摆设SQL

下一步是写SQL语句.

图 3: 应用SELECT COUNT(*) FROM Products 语句

着末给这个措施命名为TotalNumberOfProducts.

图 4:将措施命名为 TotalNumberOfProducts

点击停止后,DAL里添加了一个TotalNumberOfProducts措施.这个措施返回的值可为空,而Count语句老是返回一个非空的值.

我们还必要在BLL中加一个措施.打开ProductsBLL类文件,添加一个TotalNumberOfProducts措施,这个措施要做的只是调用DAL的TotalNumberOfProducts措施.

C#

1

2

3

4

public int TotalNumberOfProducts()

{

return Adapter.TotalNumberOfProducts().GetValueOrDefault();

}

DAL的TotalNumberOfProducts措施返回一个可空的整型,而必要ProductsBLL类的TotalNumberOfProducts措施返回一个标准的整型.调用GetValueOrDefault措施,假如可为空的整型为空,则返回默认值,0.

第三步: 返回必要的数据记录下一步我们要在DAL和BLL里创建吸收Start Row Index 和Maximum Rows 的措施,然后返回相宜的记录.我们首先看看必要的SQL语句.我们面临的寻衅是必要为全部分页的记录分配索引,用来返回从Start Row Index 开始的Maximum Records number of records笔记录.

假如在数据库表里已经有一个列作为索引,那么统统会变的很简单.我们首先会想到Products表的ProductID字段可以满意这个前提,第一个Product的ProductID为1,第二个为2,以此类推.然而当一个product被删除后,这个序列会留下距离来,以是这个措施不可.

有两种可以把全部要分页的数据和一个row index关联起来的措施.

应用SQL Server 2005的ROW_NUMBER() Keyword – SQL Server 2005的新特点,它可以将记录根据必然的顺序排列,每笔记录和一个等级相关 这个等级可以用来作为每笔记录的row index.

应用SET ROWCOUNT – SQL Server的 SET ROWCOUNT statement 可以用来指定有若干记录必要处置惩罚; table variables 是可以寄放表款式的T-SQL 变量, 和temporary tables类似. 这个措施在Microsoft SQL Server 2005 和SQL Server 2000都可以用 (ROW_NUMBER() 措施只能在SQL Server 2005里用).

这个思路是,为要分页的数据创建一个table变量,这个table变量里有一个作为主健的IDENTITY列.这样必要分页的每笔记录在table变量里就和一个row index(经由过程IDENTITY列)关联起来了.一旦table变量孕育发生,连接数据库表的SELECT语句就被履行,获取必要的记录.SET ROWCOUNT用来限定放到table变量里的记录的数量.

当SET ROWCOUNT的值指定为Start Row Index 加上Maximum Rows时,这个措施的效率取决于被哀求的页数.对付对照前面的页来说– 比如开始几页的数据– 这种措施异常有效. 然则对靠近尾部的页来说,这种措施的效率和默认分页时差不多.

本教程用ROW_NUMBER()来实现自定义分页.假如必要知道更多的关于table变量和SET ROWCOUNT的技巧,请看 A More Efficient Method for Paging Through Large Result Sets.

以下语句用来应用ROW_NUMBER()将一个等级和返回的每笔记录关联:

SQL

1

2

3

SELECT columnList,

ROW_NUMBER() OVER(orderByClause)

FROM TableName

ROW_NUMBER()返回一个根据指定排序的表示每笔记录的等级的值.比如,我们可以用以下居于查看根据价格来排序(降序)的每个product的等级:

SQL

1

2

3

SELECT ProductName, UnitPrice,

ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank

FROM Products

图5 是在Visual Studio里运行以上代码的结果. 留意product根据价格排序,每行有一个等级.

图 5: 返回的记录里每行有一个Price Rank

留意: ROW_NUMBER() 只是 SQL Server 2005里很多排级的功能中的一种. 想懂得更多的ROW_NUMBER()的评论争论,包括其它的排级功能,请看 Returning Ranked Results with Microsoft SQL Server 2005.

当应用OVER从句里的ORDER BY 列名(UnitPrice)来排级时,SQL Server会对结果排序.为了提升大年夜数据量查询时的机能,可以为用来排序的列加上非凑集索引.更多的机能斟酌参考Ranking Functions and Performance in SQL Server 2005.

ROW_NUMBER()返回的等级信息无法直接在WHERE从句中应用.而在From后面的Select里可以返回ROW_NUMBER(),并在WHERE从句里应用.比如,下面的语句应用一个From后的Select返回ProductName,UnitPrice,和ROW_NUMBER()的结果,然后应用一个WHERE从句来返回price rank在11到20之间的product.

SQL

1

2

3

4

5

6

7

SELECT PriceRank, ProductName, UnitPrice

FROM

(SELECT ProductName, UnitPrice,

ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank

FROM Products

) AS ProductsWithRowNumber

WHERE PriceRank BETWEEN 11 AND 20

更进一步,我们可以根据这个措施返回给定Start Row Index 和Maximum Rows 的页的数据.

SQL

1

2

3

4

5

6

7

SELECT PriceRank, ProductName, UnitPrice

FROM

(SELECT ProductName, UnitPrice,

ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank

FROM Products

) AS ProductsWithRowNumber

WHERE PriceRank > StartRowIndex AND PriceRank StartRowIndex + MaximumRows)

留意:我们在本教程的后面会看到, ObjectDataSource 供给的StartRowIndex是从0开始的,而ROW_NUMBER()的值从1开始.是以,WHERE从句返回会严格返回PriceRank大年夜于StartRowIndex而小于StartRowIndex+MaximumRows的那些记录.

我们已经知道若何根据给定的Start Row Index 和Maximum Rows 用ROW_NUMBER()返回特定页的数据.现在我们必要在DAL和BLL里实现它.

我们首先要抉择根据什么排序来分级.我们这里用product名字的字母顺序.这意味着我们还不能同时实现排序的功能.在后面的教程里,我们将进修若何实现这样的功能.

在前面我们应用SQL statement创建DAL措施.然则TableAdapter wizard 应用的Visual Stuido里的T-SQL 解析器不能识别带OVER语法的ROW_NUMBER()措施.是以我们要以存储历程来创建这个DAL措施.从view menu里选择server explorer(Ctrl+Alt+S),展开NORTHWND.MDF 的节点.右键点击存储历程,选择增添一个新的存储历程(见图6).

图 6: 为Products分页增添一个存储历程

这个存储历程带两个整型的输入参数- @startRowIndex和@maximumRows- 并用ROW_NUMBER()以ProductName字段排序,返回那些大年夜于@startRowIndex并小于即是@startRowIndex+@maximumRows的记录.将以下代码加到存储历程里,然后保存.

SQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

CREATE PROCEDURE dbo.GetProductsPaged

(

@startRowIndex int,

@maximumRows int

)

AS

SELECT   ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued, CategoryName, SupplierName

FROM

(

SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,

(SELECT CategoryName

FROM Categories

WHERE Categories.CategoryID = Products.CategoryID) AS CategoryName,

(SELECT CompanyName

FROM Suppliers

WHERE Suppliers.SupplierID = Products.SupplierID) AS SupplierName,

ROW_NUMBER() OVER (ORDER BY ProductName) AS RowRank

FROM Products

) AS ProductsWithRowNumbers

WHERE RowRank > @startRowIndex AND RowRank

创建完存储历程后,花点光阴测试一下.右键在Server Explorer 点名为GetProductsPaged的存储历程,选择履行.Visual Studio 会让你输入参数, @startRowIndex和@maximumRows(见图7).输入不合的值查看一下结果是什么.

图 7: 为 @startRowIndex 和@maximumRows Parameters输入值

输入参数的值后,你会看到结果.图8的结果为两个参数的值都为10的结果.

图 8: 将在第二页里显示的数据

完成存储历程后,我们可以创建ProductsTableAdapter 措施了.打开Northwind.xsd ,右键点ProductsTableAdapter,选择Add Query.选择应用已经存在的存储历程.

图 9: 应用已经存在的存储历程创建DAL Method

下一步会要我们选摘要调用的存储历程.从下拉列表里选择GetProductsPaged .

图10: 选择GetProductsPaged

下一步要选择存储历程返回的数据类型:表值,单一值,无值.因为GetProductsPaged 返回多笔记录,以是选择表值.

图 11: 为存储历程指定返回表值

着末给措施命名.象前面的措施一样,选择Fill a DataTable 和Return a DataTable,为第一个命名为FillPaged ,第二个为GetProductsPaged.

图 12: 命名措施为FillPaged 和GetProductsPaged

除了创建一个DAL措施返回特定页的products外,我们必要在BLL里也这样做.和DAL措施一样,BLL的GetProductsPaged 措施带两个整型的输入参数,分手为Start Row Index 和Maximum Rows,并返回在指定范围内的记录.在ProductsBLL 创建这个措施,仅仅调用DAL的GetProductsPaged 就可以了.

C#

1

2

3

4

5

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]

public Northwind.ProductsDataTable GetProductsPaged(int startRowIndex, int maximumRows)

{

return Adapter.GetProductsPaged(startRowIndex, maximumRows);

}

你可以为BLL措施的参数取任何名字.然则我们顿时会看到,选择用startRowIndex 和maximumRows 会让我们在设置设置设备摆设摆设ObjectDataSource 时方便很多.

第四步: 应用自定义分页设置设置设备摆设摆设ObjectDataSource 创建完BLL和DAL的措施后,我们可以筹备创建一个GridView 来应用自定义分页了.打开PagingAndSorting 文件夹里的EfficientPaging.aspx ,添加一个GridView ,然后用ObjectDataSource 来设置设置设备摆设摆设它.在我们曩昔的教程里,我们平日应用ProductsBLL 类的GetProducts 措施来设置设置设备摆设摆设ObjectDataSource .然而这一次,我们应用GetProductsPaged 措施.GetProducts 会返回所有的products而GetProductsPaged 只返回特定的记录.

图 13: 应用ProductsBLL Class类的 GetProductsPaged措施 来设置设置设备摆设摆设ObjectDataSource

我们要创建一个只读的GridView,是以在INSERT, UPDATE, 和DELETE 标签下拉列表里选择(None).

接下来ObjectDataSource 领导会让我们选择GetProductsPaged 措施的输入参数startRowIndex 和maximumRows 的值.在source里选择none.

图 14: Sources 里选择None

完成ObjectDataSource 领导后,GridView 会为每个product字段创建一个BoundField 或CheckBoxField .可以随意裁减GridView 的外不雅.我这里选择的是只显示ProductName, CategoryName, SupplierName, QuantityPerUnit, 和UnitPrice BoundFields.在智能标签里选择支持分页,GridView 和ObjectDataSource 的标记看起来应该和下面差不多:

ASP.NET

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

假如你经由过程浏览器浏览页面,你会发明看不到GridView .

图 15: GridView 没有被显示

因为在ObjectDataSource 里的GetProductsPaged的startRowIndex和maximumRows的参数都为0,由SQL没有返回任何的记录是以GridView 看不到了.

我们必要将ObjectDataSource 设置设置设备摆设摆设成为自定义分页来修补上面的问题.下面的步骤可以完成这个:

将ObjectDataSource的 EnablePaging 属性设为true – 这样表示必须传两个参数给SelectMethod措施: 一个指定Start Row Index (StartRowIndexParameterName), 一个指定Maximum Rows (MaximumRowsParameterName).

设置ObjectDataSource的 StartRowIndexParameterName 和MaximumRowsParameterName 属性– StartRowIndexParameterName 和MaximumRowsParameterName 属性是传给SelecMethod用来自定义分页的输入参数. 默认的参数名为startIndexRow and MaximumRows, 这便是在创建BLL里的GetProductsPaged措施时用这些给参数命名的缘故原由. 假如你应用了其它的参数名字–比如startIndex和maxRows–你将不得不响应的设置ObjectDataSource的StartRowIndexParameterName和MaximumRowsParameterName(startIndex和maxRows).

设置ObjectDataSource的 SelectCountMethod Property 为返回分页记录总数的措施的名字(TotalNumberOfProducts)–调用ProductsBLL类的TotalNumberOfProducts措施返回总的记录数 . ObjectDataSource 必要这个信息来精确的显示页面.

从ObjectDataSource的声明里移除startRowIndex and maximumRows元素的标记–当经由过程领导设置设置设备摆设摆设 ObjectDataSource 时, Visual Studio 自动为GetProductsPaged措施的参数增添了两个 元素. 设置EnablePaging 为true后, 这些参数会被自动通报;假如在声明代码里保留它们,那么ObjectDataSource会试图通报4个参数给GetProductsPaged和2个参数给TotalNumberOfProducts .假如你没有移除,当浏览页面的时刻你会得到一个象这样的差错信息 : “ObjectDataSource 'ObjectDataSource1' could not find a non-generic method 'TotalNumberOfProducts' that has parameters: startRowIndex, maximumRows.”

做完这些篡改后,ObjectDataSource的声明代码看起来应该和下面差不多:

ASP.NET

1

2

3

留意EnablePaging和SelectCountMethod属性已经被设置了,被移除了.图16是属性窗口.

图16: 应用自定义分页设置设置设备摆设摆设,ObjectDataSource

完成这些后,浏览页面.你会看到10条product按照字母排序被列出来了.每次翻一页看看.对用户来说现在还看不出来什么区别,由于自定义分页在大年夜数据量的环境下效率才能显示出来.

图17: 根据Product的 Name排序的数据的自定义分页

留意:自定义分页时,ObjectDataSource的SelectCountMethod措施返回的page count值存在GridView的view state里.其它变量–PageIndex,EditIndex,SelectedIndex,DataKeys聚拢等–都存在control state里.control state和GridView的EnableViewState属性无关.因为PageCount的值在postback时代存在viewstate里,当你的页面上有链到上一页的link时,你必要开启GridView的view state(假如没有这个link,你可以禁用view state).

点上一页link会引起postback,GridView会更新PageIndex属性.GridView会给PageIndex赋一个小于PageCount的值.假如禁用了view state,PageCount的值在postback时会损掉,PageIndex会被赋一个最大年夜的整型值.然后GridView在根据PageSize乘PageCount来谋略starting row index时会发生OverflowException非常.

履行自定义分页和排序今朝我们自定义分页时应用的排序字段是在创建GetProductsPaged存储历程时写逝世的.在GridView的智能标签里有一个Enable Sorting的checkbox,不幸的是,在前面的事情里加上排序功能仅仅只能将当前页的记录排序.比如,按照降序查看第一页的数据,第一页的product的顺序回反转.见图18,Carnarvon Tigers 成为第一笔记录,而在它之后的71笔记录被轻忽了.排序时只排了显示在第一页的数据.

图18: 只有当前页的数据被排序了

发生这种环境的缘故原由是调用完BLL的GetProductsPaged措施返回数据之后才排序.耳针个措施只返回特定页的记录.为了精确的排序,我们必要将排序表达式传到GetProductsPaged措施里,在返回特定页的数据提高行排序.我们将在后面的教程里完成这个功能.

履行自定义分页和删除假如你开启GridView的删除功能,你会发明删除着末一页的着末一笔记录时,GridView消掉了,而不是精确的减掉落PageIndex的值.在我们上面创建的GridView里开启删除来查看这个bug.到着末一页(第九页),因为我们有81笔记录,每页显示10条,以是你会只看到一笔记录,删除这笔记录.

在默认分页时,GridView会自动跳到第八页,这也是我们想要的结果.然而在自定义分页里, GridView却显示.发生这个的缘故原由有点越过了本教程的范围,可以看Deleting the Last Record on the Last Page from a GridView with Custom Paging.简单的说是由于点Delete时,GridView是按这样的步骤事情的:

删除记录.

按照给定的PageIndex和PageSize获取记录.

反省PageIndex确保没有跨越数据源的页的数量.假如是,GridView的PageIndex会自动减.

应用第二步获取的记录绑定到GridView适当的页.

问题的根源在于第二步,当获取显示的记录时,应用的PageIndex仍旧是着末一页的PageIndex.是以没有记录被返回.在第三步里GridView判断出PageIndex属性大年夜于数据源的总页数(由于着末一页的着末一条数据被删除了) 就对PageIndex减1.在第四步里GridView试图将第二步获取的数据作为数据源进行绑定,然则没有任何数据,是以显示的GridView不见了.在默认分页里没有这个问题是由于在第二步照样返回的所稀有据.

我们可以用两种措施来改动这个.第一是为GridView的RowDeleted事故创建一个event handler

来判断在删除页里有若干笔记录,假如只有一条,那么这条肯定是着末一条,我们必要为PageIndex减1.当然我们盼望只在删除成功后来改动PageIndex的值.我们必要用e.Exception属性是否为空来判断.

这个措施之以是起感化是由于它在第一步和第二步之间改动了PageIndex的值.是以在第二步里精确的记录会被返回.见如下代码:

C#

1

2

3

4

5

6

7

protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)

{

// If we just deleted the last row in the GridView, decrement the PageIndex

if (e.Exception == null && GridView1.Rows.Count == 1)

// we just deleted the last row

GridView1.PageIndex = Math.Max(0, GridView1.PageIndex - 1);

}

别的一种法子是为ObjectDataSource的RowDeleted事故创建一个event handler,设置AffectedRows属性为1.在第一步删除记录后(在第二步之前),假如一行或多行记录被影响,GridView会更新PageIndex的值.然而ObjectDataSource 并没有设置AffectedRows,是以这一步不会履行.我们必要在删除操作成功的环境下手动设置AffectedRows.见下面的代码:

C#

1

2

3

4

5

6

7

protected void ObjectDataSource1_Deleted(object sender, ObjectDataSourceStatusEventArgs e)

{

// If we get back a Boolean value from the DeleteProduct method and it's true, then

// we successfully deleted the product. Set AffectedRows to 1

if (e.ReturnValue is bool && ((bool)e.ReturnValue) == true)

e.AffectedRows = 1;

}

这些代码都可以在EfficientPaging.aspx的code-behind class里找到

对照默认和自定义分页的机能因为自定义分页返回必要的数据,而默认分页返回整个数据,是以自定义分页比默认分页更有效率是异常清楚的.然则机能上的提升究竟有若干?从默认分页换成自定义分页有什么机能上的上风?

很不幸,没有一个统一的谜底.机能的上风取决于很多身分,此中最紧张的是分页记录的数量,数据库的负载和web server和数据库的通信渠道.对一些小的表来说,机能的差异是可以轻忽的.对成千上万行数据的表来说,差异是异常显着的.

我们的一篇Custom Paging in ASP.NET 2.0 with SQL Server 2005文章包孕一些比较这两种分页技巧的机能测试,用到的表有大年夜概50,000 笔记录.在测试中我分手测试了在SQL Server里(应用SQL Profiler)和ASP.NET页面里(应用ASP.NET’s tracing features)履行查询的光阴.留意这是在我的开拓情况下单个用户的测试结果,是以没有仿照范例的网站的负载环境,结果也并不科学.

Avg. Duration (sec)

Reads

Default Paging – SQL Profiler

1.411

383

Custom Paging – SQL Profiler

0.002

29

Default Paging – ASP.NET Trace

2.379

N/A

Custom Paging – ASP.NET Trace

0.029

N/A 如你所见,获取特定页的数据匀称少了354 reads,并在恩短的光阴完成.而在页面里,自定义分页是默认分页所花费光阴的1/100.在my article 可以看到更多的测试信息和代码,你可以下载测试数据库在你的情况里从新测试.

总结默认分页是异常轻易实现的–你仅仅只必要选择控件上的智能标签里的Enable Paging checkbox –然则方便带来的是机能的丧掉.在默认分页时,用户无论哀求哪个页面,所有的数据都邑被返回,纵然只有一小部分被显示出来.为了提升机能,ObjectDataSource 供给了一个可选择的分页功能–自定义分页.

自定义分页经由过程只获取必要显示的数据来办理默认分页的机能问题,然则应用起来更麻烦.首先,哀求特定命据的查询语句必须精确而且有效.这个可以经由过程很多措施来实现.在本教程里我们应用SQL Server 2005的ROW_NUMBER来实现给结果分级,然后返回等级在特定范围内的数据.其次我们必要增添一个措施来获取必要分页的总记录数.在创建完DAL和BLL措施后,我们还必要设置设置设备摆设摆设ObjectDataSource以使它可以获取必要分页的总记录数,并将精确的Row Index 和Maximum Rows 的值传给BLL.

虽然应用自定义分页必要一系列的操作,而且远没有默认分页那么简单.然则在大年夜数据量的环境照样必须的.只显示必要的数据,自定义分页可以节省很多光阴,减轻数据库的包袱.

祝编程快乐!

作者简介

Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的开创人,自1998年以来不停利用 微软Web技巧。Scott是个自力的技巧咨询顾问,培训师,作家,近来完成了将由Sams出版社出版的新作,24小时内精晓ASP.NET 2.0。他的联系电邮为mitchell@4guysfromrolla.com,也可以经由过程他的博客http://ScottOnWriting.NET与他联系。

您可能还会对下面的文章感兴趣: