对于给DataGrid进行分页的方法来说,目前我所见到的也就是三种。
首先介绍一下举例的数据库结构(在SQL Server 2000下)。
字段名 | 类型 | 备注 |
EmployeeID | Int | 自增字段,主键 |
EmployeeName | Varchar(20) |
|
Salary | Int |
|
CellPhone | Varchar(20) |
|
EmailAddress | Varchar(20) |
|
第一种方法,是用DataAdapter+DataSet来实现,即用DataAdapter去填充DataSet的时候指定起始位置和最大返回记录条数,大致如下:
yourDataAdapter.Fill( dataset, startPos, maxNum, “yourTableName” );
第二种方法,是在数据库端用存储过程,例如:在SQL Server中,用两个Top语句来组成,大致如下:
CREATE PROCEDURE GetEmployees @EmployeeNum int, @StartNO int, @@TotalCount INT OUTPUT, @@RealNum INT OUTPUT AS
-- Get employees from DB through the specific number and the start position
DECLARE @PreRecCount VARCHAR( 10 )
DECLARE @CurRecCount VARCHAR( 10 )
SELECT @@TotalCount = COUNT(*) FROM EmployeeInfo
IF @@TotalCount > ( @StartNO + 1 ) * @EmployeeNum
SET @@RealNum = @EmployeeNum
ELSE
SET @@RealNum = @@TotalCount - @StartNO * @EmployeeNum
-- Get employees by the computed number
SET @CurRecCount = CAST( @StartNO * @EmployeeNum + @@RealNum AS VARCHAR( 10 ) )
IF @STARTNO = 0
EXEC( 'SELECT TOP ' + @CurRecCount + ' * FROM EmployeeInfo ORDER BY EmployeeID ASC' )
ELSE
BEGIN
SET @PreRecCount = CAST( @StartNO * @ EmployeeNum AS VARCHAR( 10 ) )
EXEC( 'SELECT TOP ' + @CurRecCount + ' * FROM EmployeeInfo WHERE EmployeeID NOT IN '
+ '(SELECT TOP ' + @PreRecCount + ' EmployeeID FROM EmployeeInfo ORDER BY EmployeeID ASC) '
+ 'ORDER BY EmployeeID ASC'
)
END
GO
第三种方法,也是在数据库端用存储过程,只不过要传进前一页最后一个关键值作为参数,大致如下:
CREATE PROCEDURE GetEmployees @EmployeeNum int, @LastEmployeeID int, @@TotalCount INT OUTPUT AS
-- Get employees from DB through the specific number and the start position
DECLARE @CurRecCount AS VARCHAR( 10 )
SELECT @@TotalCount = COUNT(*) FROM EmployeeInfo
-- Get employees by the computed number
SET @CurRecCount = CAST( @ EmployeeNum AS VARCHAR( 10 ) )
EXEC( 'SELECT TOP ' + @CurRecCount + ' * FROM EmployeeInfo WHERE EmployeeID > @LastEmployeeID ORDER BY EmployeeID ASC' )
GO
而这三种进行分页,大致性能对比如下:
| 第一种方法 | 第二种方法 | 第三种方法 |
每次操作的记录集 | 所有记录集 | 记录数不定,随着页数增加而增加 | 基本固定,即每也显示得最多记录集 |
效率(记录数较少的时候) | 三者表现不是很明显,但是还是第三种方法最快,其次是第二种,然后是第一种 | ||
效率(记录数较多的时候) | 最慢,效率与页码无关 | 页码比较靠前的时候,比较快;越往后越慢 | 最快,效率与页码无关 |
灵活性 | 这两种方法都挺好,页码可以随意跳转 | 不灵活,无法实现页码随意跳转 |
综合上面,可以看出。第二种方法是效率比较好的,且能够适应任何情况的一种实现方法。而对于第一种方法,我本人认为是不可取的,但是假如记录集不超过200,也未尝不可。第三种方法,虽说其的效率是最高的,但是其方法有一个参数不是很容易获得,即上一页最后一条记录的关键字的值或下一页第一条记录的关键字的值,因此在实际应用中,反而使用的最少。