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

本文关键字:方法 分页 SqlDataReader 实现 | 更新日期: 2023-09-27 17:50:32

我正确地使用我自己的方式来实现这一点,但我不知道它是否有效,所以这是函数:

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,我选择前10*10的结果,然后通过使用FOR语句跳过不需要的结果。如有任何建议,请提前感谢。

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

您可以在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;

如果你正在使用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

希望能有所帮助