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

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

最佳答案

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

关于c# - 在 SqlDataReader 中实现分页的正确方法!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5703889/

相关文章:

java - 无法让Java和C#通过socket进行通信

sql-server - 在插入操作之前禁用索引并在插入后启用返回索引的最佳方法

SQL 除以 2 计数()

entity-framework - Entity Framework 或 SqlDataReader

c# - sql 选择顶部 X 到 X+N

HTML Tidy 的 C# 版本?

c# - 为什么没有 MouseMoveEvent——或者,如何为鼠标移动事件使用 AddHandler

sql - 删除重复行 - 无法找到决定性的答案

c# - 处理后SqlDataReader记录的使用

c# - 如何获得当前可用的 Java 版本?