2011-04-18 14 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 * 10 परिणाम का चयन करता हूं, फिर अनचाहे परिणामों को फॉर कथन का उपयोग करके छोड़ देता हूं।
कोई सुझाव, अग्रिम धन्यवाद।

उत्तर

7

आप एसक्यूएल सर्वर पर सभी पेजिंग कर सकते हैं।

उदाहरण के लिए,

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

+0

वाह, मैं हमेशा किया था इस OFFSET का उपयोग कर लाएं। मैंने इस विधि की तुलना करने के लिए एक परीक्षण चलाया, और सीटीई बहुत अधिक कुशल है। धन्यवाद! –

2

आप एसक्यूएल सर्वर 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

आशा इस मदद करता है

संबंधित मुद्दे