2011-04-18 18 views
5

Doğru bunu başarmak için kendi yolumu kullanıyor muyum, ancak verimli olup olmadığını bilmiyorum, bu yüzden bu fonksiyonudur:SqlDataReader'da sayfalama uygulamasının doğru yolu!

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; 
} 

Düzgün çalışır ancak kodunu görmek gibi ne zaman Sayfa boyutu sayfa 10 gibi, sayfa boyutunu aldığımda, en iyi 10 * 10 sonucu seçiyorum ve ardından FOR deyimini kullanarak istenmeyen sonuçları atladım.
Herhangi bir öneri, şimdiden teşekkürler.

cevap

7

Tüm çağrıları sql sunucusundan yapabilirsiniz. Eğer bu şekilde yapmak istiyorum, sonra, TOP kullanılarak başında satır atlama ısrar yoksa Örneğin

oldukça yapabileceğin tek ve tamam olduğunu

http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx

görüyoruz. Eğer o zaman ortak tablo İfadeler ve ROW_NUMBER() işlevi inşa kullanabilirsiniz SQL Server 2008 kullanıyorsanız

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

yardımcı olur:/ – Rawhi

+0

Vay be, ben her zaman bu FETCH OFFSET kullanarak yapmıştı. Bu yöntemi bu yöntemle karşılaştırmak için bir test yaptım ve CTE çok daha verimli. Teşekkürler! –

2

(yukarıdaki bağlantıdan)

çok kolay ve verimli bunu başarmak için.

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 

bkz

http://msdn.microsoft.com/en-us/library/ms186734.aspx

Ve

10 ve çalıştırma sonucunda 100 değiştirin ve daha fazla bilgi için sayfa

satırını biten olarak

Sorgunuzu yazacak

http://msdn.microsoft.com/en-us/library/ms190766.aspx

Umut bu Bu iyi çalışıyor ama yapılması gereken çok fazla zaman alır