我必须开发一个层来从数据库中检索数据(可以是SQL Server,Oracle或IBM DB2)。查询(通用)由开发人员编写,但我可以在我的层中修改它们。这些表可能很大(比如说> 1 000 000行),并且它们有很多连接(例如,我有一个带有35个连接的查询 - 无法减少)。
所以,我必须开发一个分页系统,来检索一个“页面”(比如50行)。
图层(在dll中)用于桌面应用程序。
重要事实:查询永远不会按ID排序。
我找到的唯一方法是生成一个唯一的行号(使用MSSQL ROW_NUMBER()函数)但不能与Oracle一起使用,因为连接太多了。
有没有人知道另一种方式?
答案 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页)。