快速业务通道

DataGrid基于Access的快速分页法

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
分页速度最快,最中间的分页速度最慢。

例如:@PageIndex=3,红 --> 黄 --> 蓝

DataGrid基于Access的快速分页法

(4)@PageIndex >= @LastIndex

取最后一页的记录可以简单地使用类似状态(1)的做法:

SELECT * FROM (
SELECT TOP @PageSize @QueryFields
FROM @TableName
WHERE @Condition
ORDER BY @PrimaryKey DESC
) TableA ORDER BY @PrimaryKey ASC

不过,这样产生的最后一页不一定是实际意义上的最后一页。因为最后一页的记录数未必刚好跟@PageSize相等,而上面的SQL语句是直接取得倒数的@PageSize条记录。如果想要精确地取得最后一页的记录,应该在先计算出该页的记录数,作为TOP语句的条件:

SELECT * FROM (
SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFields
FROM @TableName WHERE @Condition
ORDER BY @PrimaryKey DESC
) TableA ORDER BY @PrimaryKey ASC

降序的SQL语句

降序的SQL语句跟升序的大同小异,这里就不在罗嗦了J

(1)@PageIndex <= @FirstIndex

SELECT TOP @PageSize @QueryFields FROM @TableName WHERE @Condition ORDER BY @PrimaryKey DESC

(2)@FirstIndex < @PageIndex <= @MiddleIndex

SELECT TOP @PageSize @QueryFields
FROM @TableName
WHERE @PrimaryKey < (
SELECT MIN(@PrimaryKey) FROM (
SELECT TOP @PageSize*@PageIndex @PrimaryKey
FROM @TableName
WHERE @Condition
ORDER BY @PrimaryKey DESC
) TableA
) WHERE @Condition
ORDER BY @PrimaryKey DESC

(3)@MiddleIndex < @PageIndex < @LastIndex

SELECT * FROM (
SELECT TOP @PageSize @QueryFields
FROM @TableName
WHERE @PrimaryKey > (
SELECT MAX(@PrimaryKey) FROM (
SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKey
FROM @TableName
WHERE @Condition
ORDER BY @PrimaryKey ASC
) TableA
) WHERE @Condition
ORDER BY @PrimaryKey ASC
) TableB ORDER BY @PrimaryKey DESC

(4)@PageIndex >= @LastIndex

SELECT * FROM ( SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFields
 FROM @TableName WHERE @Condition ORDER BY @PrimaryKey ASC
) TableA ORDER BY @PrimaryKey DESC

如何动态产生上述的SQL语句?

看了上面的SQL语句之后,相信大家已经基本明白该分页法的原理了。下面,我们将要设计一个动态生成SQL语句的类FastPaging。该类有一个公有静态方法,它根据您给出的条件动态生成SQL语句,作为方法的返回值。

// 产生根据指定字段排序并分页查询的 SELECT 语句。
public static String Paging(
int pageSize, //每页要显示的记录的数目。
int pageIndex, //要显示的页的索引。
int recordCount, //数据表中的记录总数。
String tableName, //要查询的数据表。
String queryFields, //要查询的字段。
String primaryKey, //主键字段。
bool ascending, //是否为升序排列。
String condition //查询的筛选条件。
) {
StringBuilder sb = new StringBuilder();
int pageCount = GetPageCount(recordCount,pageSize); //分页的总数
int middleIndex = GetMidPageIndex(pageCount); //中间页的索引
int firstIndex = 0; //第一页的索引
int lastIndex = pageCount - 1; //最后一页的索引
if (pageIndex <= firstIndex) {
// 代码略
} else if (pageIndex > firstIndex && pageIndex <= middleIndex) {
sb.Append("SELECT TOP ").Append(pageSize).Append(" ")
.Append(queryFields).Append(" FROM ").Append(tableName)
.Append(" WHERE ").Append(primaryKey);
if (ascending)
sb.Append(" > (").Append(" SELECT MAX(");
else
sb.Append(" &

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号