SqlDataReader中实现分页的正确方法!

5

我正在使用自己的方法实现这个功能,但我不确定是否高效。以下是该功能代码:

public SqlDataReader GetArticlesByPage(int pageNum, int pageSize)
{
    if (pageNum == 0)
        pageNum = 1;
    SqlDataReader dr = SqlHelper.ExecuteReader(string.Format("SELECT TOP {0} Des, Id, Title, Icon FROM Threads ORDER BY Id DESC", pageSize * pageNum));
    int div = pageNum - 1;
    div = pageSize * div;
    for (int i = 0; i < div; i++)
        dr.Read();
    return dr;
}

它的功能很好,但是当我需要获取第10页的文章时,如果每页显示10篇文章,我需要选择前100个结果,然后使用FOR语句跳过不需要的结果。
有什么建议吗?谢谢。

2个回答

8
你可以在SQL Server中完成所有的分页操作。
例如,请参见:

http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx

如果您不想这样做并坚持使用 TOP,那么跳过开头的行就是您所能做的,这样做是可以的。
DECLARE @PageNum AS INT;
DECLARE @PageSize AS INT;
SET @PageNum = 2;
SET @PageSize = 10;

WITH OrdersRN AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
          ,OrderID
          ,OrderDate
          ,CustomerID
          ,EmployeeID
      FROM dbo.Orders
)

SELECT * 
  FROM OrdersRN
 WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 
                  AND @PageNum * @PageSize
 ORDER BY OrderDate
         ,OrderID;

哇,我一直都是使用 OFFSET FETCH 来完成这个操作。我进行了一项测试,比较了这种方法和 CTE 的效率,结果发现 CTE 更加高效。谢谢! - Onkel-j

2
如果您使用的是SQL Server 2008,那么可以使用内置的公共表达式和ROW_NUMBER()函数来轻松高效地实现此操作。
查询语句如下:
WITH MAINSQL AS(

SELECT Des, Id, Title, Icon,
rownum = ROW_NUMBER() OVER (Order by Id desc)
 FROM Threads 
)
SELECT * FROM MAINSQL WHERE rownum between 10 AND 100

请将页面的起始行和结束行替换为10和100

更多信息请参见

http://msdn.microsoft.com/en-us/library/ms186734.aspx

http://msdn.microsoft.com/en-us/library/ms190766.aspx

希望这有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接