为了在大数据量中减少客户端在使用表格时对服务器及网络等资源的占用,我们需要在XtraGrid表格中实现分页操作的功能。根据这个功能需求,结合XtraGrid的基本功能,提出了以下2种实现分页操作的方案,并逐一进行了研究和论证。
1、利用XtraGrid本身的Server Mode模式
XtraGrid为了满足对大数据量访问时的性能要求,提供了一种叫做Server Mode的工作模式,在这种模式中,XtraGrid将不会一次性从数据源中读取所有数据到内存中,而是根据需要从数据源中读取少量数据并显示到屏幕上。但XtraGrid在这种模式下工作时有一些限制:
1)不能编辑、增加、删除数据;
2)不能通过显示值来进行排列和过滤数据(但可以用编辑值来进行这些操作);
3)用户排序时不触发ColumnView.CustomColumnSort事件;
4)用户分组时不触发GridView.CustomColumnGroup事件;
5)用户计算汇总时不触发GridView.CustomSummaryCalculate事件;
6)在Server Mode模式下,数据表的主键不能由多个列组合而成。
此外,因为在XtraGrid的Server Mode模式下可以使用eXpress Persistent Objects library (XPO)方式联接数据源,所以在使用XPO方式联接时,也需要相关数据库支持XPO方式,以下就列出了支持XPO方式的数据库及版本:
Database Engine |
Version(s) |
Advantage |
Advantage Data Architect v7.1 |
Asa |
SQL Anywhere 8, SQL Anywhere 9 |
Ase |
Sybase Adaptive Server 12 |
DB2 |
DB2 8.1.9 |
Firebird |
Firebird 1.5, Firebird 2.0 |
MSAccess |
Microsoft Jet |
MSSqlServer |
Microsoft SqlServer 7.0, Microsoft SqlServer 2000, MS SQL Server 2000 Desktop Engine (MSDE 2000), Microsoft SqlServer 2005, SQL Server 2005 Express Edition |
MSSqlServerCE |
Microsoft SqlServer 2005 Mobile, Microsoft SqlServer 2005 Everywhere Edition CTP |
MySql |
MySQL Server 4.1, MySQL Server 5.0 |
Oracle |
Oracle 9i, Oracle 10g |
Pervasive |
Pervasive.SQL 9 |
Postgres |
PostgreSQL 8.1 |
SQLite |
SQLite 3 |
VistaDB |
VistaDB 2.1 |
优点:1)实现简单。2)效率高。
缺点:1)由于 XtraGrid的Server Mode模式下的确是限制了对数据的编辑操作,表格就只能看不能写,从而无法达到我们在表格中编辑数据的要求。
结论:因为在查找项控件(LookupEdit控件)中只会去读取选项来进行选择,所以可以使用该模式来提高速度。对于一般表格,只使用这种方式实现分页查看功能,但不能用于编辑。
2、利用数据库的关键字和算法
在SQLSERVER和ORACLE中,可以利用一些特殊的关键字和算法(SQL)来实现分页功能。
1)在SQLSERVER中,可以利用TOP关键字来实现分页功能,例如以下SQL就能实现分页算法:
select top [pagesize] *
from table
where id not in
( select top [pagesize*(currentpage-1)] id from table [查询条件] order by id )
and [查询条件]
order by id
2)在ORACLE中可以利用ROWNUM关键字来实现分页算法,例如以下分页算法:
SELECT *
FROM ( SELECT row_.*, rownum rownum_
FROM (...... ) row_
WHERE rownum <= ?)
WHERE rownum_ > ?
3)在MYSQL中利用LIMIT关键字来实现分页算法,例如以下分页算法:
select *
from table [查询条件]
order by id limit ?,?
优点:1)能完全实现功能需求;
2)效率高,资源占用少。
缺点:1)实现比较复杂,需要针对不的数据库设计不同的SQL来实现。
结论:对于我们的表格分页编辑需求,虽然会增加一定的编程工作量,但这种实现方案是最合适的。