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

时间:2011-04-18 13:52:03

标签: c# sql-server sqldatareader

我正确地使用自己的方式实现这一目标,但我不知道它是否有效,所以这就是功能:

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语句跳过不需要的结果。
任何建议,提前谢谢。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

如果您使用的是SQL Server 2008,则可以使用内置的Common表Expressions和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

希望这有帮助

相关问题