2011-04-18 97 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

希望這有助於

相關問題