2009-08-25 49 views

回答

9

你可以使用LINQ,例如:

var customerPage = dataContext.Customers.Skip(50).Take(25); 

,然後顯示的25個客戶。

參見Scott Guthrie的優秀Using LINQ-to-SQL - 第6節 - 檢索產品,服務器端分頁。

(SQL Server 2005和高達上)的另一種選擇是使用有序的CTE(公共表表達式) - 是這樣的:

WITH CustomerCTE AS 
(
    SELECT CustomerID, 
     ROW_NUMBER() OVER (ORDER BY CustomerID DESC) AS 'RowNum' 
    FROM Customers 
) 
SELECT * FROM CustomerCTE 
WHERE rownum BETWEEN 150 AND 200 

你基本上在使用ROW_NUMBER功能的排序條件而定定義CTE,然後你可以隨意挑選任意數量的人(這裏是150到200之間的人)。這是非常有效且非常有用的服務器端分頁。加入這個CTE與你的實際數據表,你可以檢索你需要的任何東西!

馬克

PS:好吧,所以OP只有手頭的SQL Server 2000,所以CTE不會:-(

工作,如果您不能更新到SQL Server 2005中,或。 NET 3.5,恐怕你只有真正可行的選項是存儲過程,你可以做這樣的事情 - 看這個博客帖子Efficient and DYNAMIC Server-Side paging with SQL Server 2000,或Paging with SQL Server Stored Procedures

+0

感謝您的回覆。 我的情況是在.NET 2.0和SQL Server 2000中(沒有linq和SQL Server 2005中的一些新功能)。 – 2009-08-25 14:35:49

+0

這是不幸的,因爲CTE也僅在SQL Server 2005中引入:-( – 2009-08-25 16:40:59

3

最好是使用ORM系統將生成動態頁面的代碼爲你 - LINQ To SQL,NHibernate,實體框架,SubSonic等。

如果你有一個小的結果集,您可以使用DataPager,PagedDataSource,或手動使用LINQ跳過和採取命令在服務器上的頁面。

+0

Thanks.I喜歡DIY,我個人認爲ASP.NET Framework的一些選項是複雜和重量級的。 – 2009-08-25 14:38:33

+1

對於他自己 - 我認爲DIY數據訪問是一個壞消息,做對的時間很長,大多數人都不會這樣做,那麼以後你就會堅持保留它,因爲你是唯一一個關心它的人 – 2009-08-25 15:34:55

0

(新的答案,因爲你使用SQL Server 2000,.NET 2.0,並且不希望使用ORM)

有兩種方式來處理頁面在SQL Server 2000:

  1. 如果你有一個ID列的順序沒有洞,你可以執行一個SQL字符串說像SELECT Name, Title FROM Customers WHERE CustomerID BETWEEN @low and @high - @low和@high是是基於頁面大小和頁面,你是計算參數。關於here的更多信息。

  2. 如果你沒有一個連續的ID,你最終使用的最小ID和@@ ROWCOUNT選擇範圍。例如,SET @@rowcount 20; SELECT Name, Title FROM Customers WHERE CustomerID > @low' - 要麼根據頁面大小和頁面計算@low,要麼從最後顯示的CustomerID計算@low。有關於該方法的一些信息here

如果您有一個小的數據集,您可以在.NET代碼中對其進行分頁,但效率較低。我建議的PagedDataSource,但如果你想自己動手寫,你可以剛剛從一個SqlDataReader讀你的記錄到一個數組,然後use the Array.Range function to page through it

+0

使用「set @ @rowcount 20「並使用頂部關鍵字? – Amy 2009-08-25 17:18:12

0

那麼我一般的做法通常是創建兩個表爲被尋呼的結果。第一個是具有搜索ID標識列並具有最小和最大行號的信息表。第二個表包含實際結果並且具有行號的標識列。我插入到第二個表中,獲取最小和最大行並將它們存儲在第一個表中。然後我可以通過選擇我想要的行來翻頁。我通常在插入前使用代碼在24小時後將結果過期。我通常使用存儲過程爲我執行插入操作,但是您可以在沒有存儲過程的情況下執行插入操作。

這樣做的好處是隻需執行一次更復雜的sql搜索。數據集不會在頁面顯示之間改變。這是數據的快照。它也可以減輕服務器端的排序。我只需要按順序選擇這些行並重新插入到第二個表中。

相關問題