通用分页系统

时间:2011-03-30 13:17:37

标签: c# sql ado.net

我必须开发一个层来从数据库中检索数据(可以是SQL Server,Oracle或IBM DB2)。查询(通用)由开发人员编写,但我可以在我的层中修改它们。这些表可能很大(比如说> 1 000 000行),并且它们有很多连接(例如,我有一个带有35个连接的查询 - 无法减少)。

所以,我必须开发一个分页系统,来检索一个“页面”(比如50行)。

图层(在dll中)用于桌面应用程序。

重要事实:查询永远不会按ID排序。

我找到的唯一方法是生成一个唯一的行号(使用MSSQL ROW_NUMBER()函数)但不能与Oracle一起使用,因为连接太多了。

有没有人知道另一种方式?

2 个答案:

答案 0 :(得分:1)

只有两种方法可以进行分页代码。

第一个是特定于数据库的。这些数据库中的每一个在分析结果集方面都有非常不同的最佳实践。这意味着您的图层必须知道底层数据库是什么。

第二种是按原样执行查询,然后只是在流上发送相关记录。这有明显的性能问题,因为它需要您的数据层基本上一直抓取所有记录。


这是恕我直言,人们不应该尝试编写数据库不可知代码的主要原因。在一天结束时,RDBM之间存在足够的差异,因此有一个可插拔的数据层架构可以利用它可以使用的特定RDBM。

简而言之,没有ANSI标准。例如:

MySql 使用LIMIT关键字进行分页 Oracle 有ROWNUM,必须与子查询结合使用。 (不确定何时介绍)
SQL Server 2008 有ROW_NUMBER,应该与CTE一起使用 SQL Server 2005 在查询中有一种完全不同(并且非常复杂)的方式,需要几个不同的proc和一个函数。
IBM DB2 具有rownumber(),它也必须作为子查询实现。

答案 1 :(得分:0)

如果要在Web端执行此操作,可以在对象集合上执行LINQ。

list.Skip(numPages * itemsPerPage).Take(itemsPerPage)

让您跳到指定页面(又名numPages = 0是第1页)。