在网上年到很多网站都写了不少关于DataGrid实现分页的方法,分页一直是很多初学ASP.NET的人感到棘手的问题,特别是自定义分页功能,实现方法多种多样,非常灵活。使用分页的缺点是DataGrid控件绑定到该DataSet之后,它的自动分页功能会帮你从该DataSet中筛选出当前分页的数据并显示出来,其他没有用的数据将被丢弃,对于小数量的记录,这种开销可能是比较小的,如果针对大量数据的分页,开销将会非常巨大,从而导致分页的速度非常的慢。换句话说,就算每个DataGrid分页面要显示的数据只是一个拥有几万条记录的数据库表的其中10条,每次DataGrid进行分页时还是要从该表中取出所有的记录。
很多人已经意识到了这个问题,并提出了解决方法:用自定义分页,每次只从数据库中取出要显示的数据。这样,我们需要在SQL语句上下功夫了。由于Access不支持真正的存储过程,在编写分页算法上就没有SQL Server那么自由了。SQL Server可以在存储过程中利用临时表来实现高效率的分页算法,受到了广泛的采用。而对于Access,我们必须想办法在一条SQL语句内实现最高效的算法。用一条SQL语句取得某段数据的方法有好几种。算法不同,效率也就不同。我经过粗略的测试,发现效率最差的SQL语句执行时耗费的时间大概是效率最高的SQL语句的3倍!而且这个数值会随着记录总数的增加而增加。至于如何实现Access的快速分页的代码很多网站都有介绍,具体内容俺就不在此写这么多了。
本文将针对各网站的Access数据库下的快速分页法的SQL句子修正了一些bug并转换成vb.net语法,以下是完整的函数:
1 ''' <summary>
2 ''' 获取根据指定字段排序并分页查询的 SELECT 语句。
3 ''' </summary>
4 ''' <param name="pageSize">每页要显示的记录的数目。</param>
5 ''' <param name="pageIndex">要显示的页的索引。</param>
6 ''' <param name="recordCount">数据表中的记录总数。</param>
7 ''' <param name="tableName">要查询的数据表。</param>
8 ''' <param name="queryFields">要查询的字段。</param>
9 ''' <param name="primaryKey">主键字段。</param>
10 ''' <param name="ascending">是否为升序排列。</param>
11 ''' <param name="condition">查询的筛选条件。</param>
12 ''' <returns>返回排序并分页查询的 SELECT 语句。</returns>
13 ''' <remarks></remarks>
14 Public Shared Function Paging()Function Paging(ByVal pageSize As Integer, ByVal pageIndex As Integer _
15, ByVal recordCount As Integer, ByVal tableName As String, ByVal queryFields As String _
16, ByVal primaryKey As String, ByVal ascending As Boolean, ByVal condition As String) As String
17Dim sb As New StringBuilder()
18Dim pageCount As Integer = GetPageCount(recordCount, pageSize) ’分页的总数
19Dim middleIndex As Integer = GetMidPageIndex(pageCount) ’中间页的索引
20Dim firstIndex As Integer = 0 ’第一页的索引
21Dim lastIndex As Integer = pageCount - 1 ’最后一页的索引
2223If pageIndex <= firstIndex Then
24 sb.Append("SELECT TOP ").Append(pageSize).Append(" ").Append(queryFields) _
25.Append(" FROM ").Append(tableName)
2627If condition <> String.Empty Then
28 sb.Append(" WHERE ").Append(condition)
29End If
30 sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(ascending))
31End If
3233If pageIndex > firstIndex AndAlso pageIndex <= middleIndex Then
34 sb.Append("SELECT TOP ").Append(pageSize).Append(" ").Append(queryFields).Append(" FROM ") _
35.Append(tableName).Append(" WHERE ").Append(primaryKey)
36If ascending Then
37 sb.Append(" > (").Append(" SELECT MAX(")
38Else
39 sb.Append(" < (").Append(" SELECT MIN(")
40End If
41 sb.Append(primaryKey).Append(") FROM ( SELECT TOP ").Append((pageSize * pageIndex)) _
42.Append(" ").Append(primaryKey).Append(" FROM ").Append(tableName)
4344If condition <> String.Empty Then
45 sb.Append(" WHERE ").Append(condition)
46End If
47 sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(ascending)) _
48.Append(" ) TableA )")
4950If condition <> String.Empty Then
51 sb.Append(" AND ").Append(condition)
52End If
53 sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(ascending))
54End If
55If pageIndex > middleIndex AndAlso pageIndex < lastIndex Then
56 sb.Append("SELECT").Append(" ").Append(queryFields).Append(" FROM ( SELECT TOP ") _
57.Append(pageSize).Append(" ").Append(queryFields).Append(" FROM ") _
58.Append(tableName).Append(" WHERE ").Append(primaryKey)
59If ascending Then
60 sb.Append(" < (").Append(" SELECT MIN(")
61Else
62 sb.Append(" > (").Append(" SELECT MAX(")
63End If
64 sb.Append(primaryKey).Append(") FROM ( SELECT TOP ") _
65.Append((recordCount - pageSize * (pageIndex + 1))) _
66.Append(" ").Append(primaryKey).Append(" FROM ").Append(tableName)
6768If condition <> String.Empty Then
69 sb.Append(" WHERE ").Append(condition)
70End If
71 sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(Not ascending)) _
72.Append(" ) TableA )")
7374If condition <> String.Empty Then
75 sb.Append(" AND ").Append(condition)
76End If
77 sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(Not ascending)) _
78.Append(" ) TableB ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(ascending))
79End If
80If pageIndex >= lastIndex Then
81 sb.Append("SELECT").Append(" ").Append(queryFields).Append(" FROM ( SELECT TOP ") _
82.Append((recordCount - pageSize * lastIndex)).Append(" ").Append(queryFields).Append(" FROM ").Append(tableName)
83If condition <> String.Empty Then
84 sb.Append(" WHERE ").Append(condition)
85End If
86 sb.Append(" ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(Not ascending)) _
87.Append(" ) TableA ORDER BY ").Append(primaryKey).Append(" ").Append(GetSortType(ascending))
88End If
89Return sb.ToString()
90End Function