【问题标题】:The proper way to implement paging in SqlDataReader !在 SqlDataReader 中实现分页的正确方法!
【发布时间】:2011-04-18 13:52:03
【问题描述】:

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

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

【问题讨论】:

    标签: c# sql-server sqldatareader


    【解决方案1】:

    你可以在 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 的效率要高得多。谢谢!
    【解决方案2】:

    如果您使用的是 SQL Server 2008,那么您可以使用内置的 Common table 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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多