DataGrid连接Access的快速分页法(1)——需求与现状

谁为典韦

谁为典韦

2016-02-19 17:52

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的DataGrid连接Access的快速分页法(1)——需求与现状,手机电脑控们准备好了吗?一起看过来吧!

  DataGrid连接Access的快速分页法(1)——需求与现状

一、需求分析

DataGrid是一个功能强大的ASP.NET Web服务器端控件,它除了能够按各种方式格式化显示数据,还可以对数据进行动态的排序、编辑和分页。大大减轻了广大Web程序员的工作量。实现DataGrid的分页功能一直是很多入门者感到棘手的问题,特别是自定义分页功能,实现的方法多种多样,非常灵活。

目前大家公认性能最好的应该数SQL Sever结合存储过程的解决方案。因为在SQL Server的存储过程里面可以使用游标(Cursor)来遍历数据库表中所有的行,结合一个计数器变量就可以快速定位到数据库表中的某一行了。但是在采用Access数据库的ASP.NET应用程序中,一直没有一种较好的解决方案。

我们知道,在ASP中可以使用ADO的游标来快速定位当前页面的数据在数据库表中的位置。可是ADO.NET中没有游标这个东西,所以传统的DataGrid分页方法都是用诸如“SELECT * FROM Item”的SQL语句从数据库表中取出所有的记录,然后DataGrid的自动分页功能会帮你显示相应分页的数据。

二、目前的解决方案

很多人已经意识到了上面描述的问题,并提出了解决方法,即采用自定义分页,每次从数据库表中取出要显示的数据。那么,怎样取呢?答案就我知道的大概有5种以上吧。使用不同的算法,将会得到不同的效率。经过我粗略的测试,最慢的算法耗费的时间大概是最快的3倍!而且这个数字会随着记录总数的增加而增加。

为了方便接下来的讨论,在展示 SQL 语句之前,首先让我们做如下约定:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

PageIndex ItemId
ProductId
Price
0
001
0011
$12

002
0011
$13

003
0011
$12

1
004
0012
$13

005
0012
$11

006
0012
$14

2
007
0013
$14

008
0013
$12

009
0014
$13

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

3
010
0011
$13

011
0012
$15

012
0014
$16

4
013
0013
$12

014
0013
$13

变量 用途
@PageSize 每页显示的记录总数
@PageCount 分页总数
@RecordCount 数据表的记录总数
@PageIndex 当前页的索引
@FirstIndex 第一页的索引
@MiddleIndex 中间页的索引
@LastIndex 最后一页的索引
@TableName 数据库表名称
@PrimaryKey 主键字段名称
@QueryFields 要查询的字段集
@Condition 筛选条件


定义:
@PageCount = (int)Math.Ceiling((double)@RecordCount / @PageSize)
@FirstIndex = 0
@LastIndex = @PageCount - 1
@MiddleIndex = (int)Math.Ceiling((double)@PageCount / 2) – 1

预设:
@PageSize = 2
@RecordCount = 9
@PageCount = 4

现在先让我们来看看速度最慢的 SQL 语句:

SELECT TOP @PageSize * FROM @TableName AS a
WHERE @PrimaryKey NOT IN (
SELECT TOP @PageSize*@PageIndex @PrimaryKey FROM @TableName AS b
ORDER BY @PrimaryKey
)
ORDER BY @PrimaryKey

这条语句慢就慢在 NOT IN 这里,主 SELECT 语句遍历的每个 @PrimaryKey 的值都要跟子 SELECT 语句的结果集中的每一个 @PrimaryKey 的值进行比较,这样时间复杂度非常大。其实我们平时编写 SQL 语句的时候应该尽量避免用 NOT IN 语句,因为它往往会提高整个 SQL 语句的时间复杂度。

还有一种是用两个 TOP 的 SQL 语句,如下所示:

SELECT * FROM (
SELECT TOP @PageSize * FROM (
SELECT TOP @PageSize*(@PageIndex+1) * FROM @TableName
ORDER BY @PrimaryKey
) TableA
ORDER BY @PrimaryKey DESC
) TableB
ORDER BY @PrimaryKey

这条 SQL 语句空间复杂度比较大。如果要显示的分页面刚好是最后一页,那么它的效率比直接SELECT 出所有的记录还要低。

展开更多 50%)
分享

猜你喜欢

DataGrid连接Access的快速分页法(1)——需求与现状

编程语言 网络编程
DataGrid连接Access的快速分页法(1)——需求与现状

DataGrid连接Access的快速分页法(5)——实现快速分页

编程语言 网络编程
DataGrid连接Access的快速分页法(5)——实现快速分页

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

DataGrid基于Access的快速分页法

Web开发
DataGrid基于Access的快速分页法

DataGrid 分页问题

ASP
DataGrid 分页问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

用DataGrid分页

电脑网络
用DataGrid分页

通过ASP与ACCESS数据库建立连接(附源码)(1)

ASP
通过ASP与ACCESS数据库建立连接(附源码)(1)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

2009年最不应该制作的六种网站

2009年最不应该制作的六种网站

利用API播放AVI

利用API播放AVI
下拉加载更多内容 ↓