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

news/2024/9/19 23:24:57

作者:黎波

一、需求分析

     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 语句之前,首先让我们做如下约定:
 
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

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 出所有的记录还要低。
 
 

http://lihuaxi.xjx100.cn/news/226067.html

相关文章

java在己有的类创子类怎么创_如何使用Java创建自己的异常子类

Java不知道学了多少课时了,你知道如何使用Java创建自己的异常子类吗,Java的内置异常处理有哪些常见的错误呢,今天IT培训网小编就来给大家详细介绍下吧:尽管Java的内置异常处理大多数常见错误,你也许希望建立你自己的异…

DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序与降序)

作者:黎波 一、相关概念 在 ACCESS 数据库中,一个表的主键(PRIMARY KEY,又称主索引)上必然建立了唯一索引(UNIQUE INDEX),因此主键字段的值是不会重复的。并且索引页依据索引列的值…

C#命名空间

转自:http://dev.yesky.com/msdn/192/2549192.shtml 命名空间提供了一种组织相关类和其他类型的方式。与文件或组件不同,命名空间是一种逻辑组合,而不是物理组合。在C#文件中定义类时,可以把它包括在命名空间定义中。以后&#xf…

java byte xml_Java XMLInputSource.setByteStream方法代码示例

import org.apache.xerces.xni.parser.XMLInputSource; //导入方法依赖的package包/类/*** Resolves an external parsed entity. If the entity cannot be* resolved, this method should return null.** param resourceIdentifierdescription of the resource to be revsoved…

DataGrid连接Access的快速分页法——动态生成SQL语句

作者&#xff1a;黎波using System;using System.Text;namespace Paging{/// <summary>/// FastPaging 的摘要说明。/// </summary>public class FastPaging {private FastPaging() {}/// <summary>/// 获取根据指定字段排序并分页查询的 SELECT 语句。/// &…

vs2008中,创建基于对话框的mfc动态库步骤

1、利用MFC Dll向导初始生成一个mfc dll(默认设置)&#xff1b; 2、添加一个对话框资源&#xff1b; 3、向工程中添加一个.h、.cpp文件&#xff0c;作为外部的接口&#xff1b; 4、.h头文件的格式仿照于基于控制台的dll的头文件格式&#xff1b; 5、.h头文件中包括资源文件头文…

分页传页数的方法

<!DOCTYPE html><html> <head> <meta charset"UTF-8"> <title></title> </head> <body> <div> <span id"num">1</span> <button id"prev">上一页</button> <…

显示DataGrid序号的一个适用的方法

作者Blog&#xff1a;http://blog.csdn.net/wangj2001/如果数据量小的话没有问题&#xff0c;一旦数据量大&#xff0c;显示特别慢&#xff0c;还有个缺点就是拖动行高时行号不随行高的变化而变动&#xff0c;出现是几个序号在一个单元格中显示。我自己对他们的算法进行总结&am…