2011-04-18 99 views
5

我正确使用我自己的方式来实现这一点,但我不知道这是否是有效与否,所以这是功能:在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结果,然后使用FOR语句跳过不想要的结果时,我需要采用第10页的文章。
任何建议,在此先感谢。

回答

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; 
+0

这工作得很好,但它需要做这么多的时间:/ – Rawhi 2011-04-18 14:14:14

+0

哇,我总是这样做使用胶印FETCH。我跑了一个测试来比较这个方法,CTE效率更高。谢谢! – 2017-09-05 18:16:35

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

希望这有助于

相关问题