如果沒有存儲過程,如何在ASP.NET中對從SQL Server中檢索到的結果集進行分頁?如果沒有存儲過程,如何在ASP.NET中對結果集進行分頁?
回答
你可以使用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
最好是使用ORM系統將生成動態頁面的代碼爲你 - LINQ To SQL,NHibernate,實體框架,SubSonic等。
如果你有一個小的結果集,您可以使用DataPager,PagedDataSource,或手動使用LINQ跳過和採取命令在服務器上的頁面。
Thanks.I喜歡DIY,我個人認爲ASP.NET Framework的一些選項是複雜和重量級的。 – 2009-08-25 14:38:33
對於他自己 - 我認爲DIY數據訪問是一個壞消息,做對的時間很長,大多數人都不會這樣做,那麼以後你就會堅持保留它,因爲你是唯一一個關心它的人 – 2009-08-25 15:34:55
(新的答案,因爲你使用SQL Server 2000,.NET 2.0,並且不希望使用ORM)
有兩種方式來處理頁面在SQL Server 2000:
如果你有一個ID列的順序沒有洞,你可以執行一個SQL字符串說像
SELECT Name, Title FROM Customers WHERE CustomerID BETWEEN @low and @high
- @low和@high是是基於頁面大小和頁面,你是計算參數。關於here的更多信息。如果你沒有一個連續的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。
使用「set @ @rowcount 20「並使用頂部關鍵字? – Amy 2009-08-25 17:18:12
這是我如何處理我所有的呼叫,並以我ASP.NET 2.0應用程序的AJAX排序。
http://programming.top54u.com/post/AJAX-GridView-Paging-and-Sorting-using-C-sharp-in-ASP-Net.aspx
那麼我一般的做法通常是創建兩個表爲被尋呼的結果。第一個是具有搜索ID標識列並具有最小和最大行號的信息表。第二個表包含實際結果並且具有行號的標識列。我插入到第二個表中,獲取最小和最大行並將它們存儲在第一個表中。然後我可以通過選擇我想要的行來翻頁。我通常在插入前使用代碼在24小時後將結果過期。我通常使用存儲過程爲我執行插入操作,但是您可以在沒有存儲過程的情況下執行插入操作。
這樣做的好處是隻需執行一次更復雜的sql搜索。數據集不會在頁面顯示之間改變。這是數據的快照。它也可以減輕服務器端的排序。我只需要按順序選擇這些行並重新插入到第二個表中。
- 1. 在存儲過程中對結果進行分組
- 2. 如何在JSP中對整個結果集進行分頁
- 3. EF6存儲過程沒有結果
- 4. 如何在存儲過程中檢查結果集爲空
- 5. 如何在JPA中獲取存儲過程的結果集?
- 6. 存儲過程中的SQL結果集
- 7. 過濾存儲過程的結果集
- 8. Oracle存儲過程返回分頁結果集
- 9. 有沒有辦法關閉存儲過程的結果集?
- 10. 如何對結果集進行旋轉
- 11. 如何在JPA中對我的結果查詢進行分頁?
- 12. 如何在CakePHP中對結果進行分頁
- 13. 如何從NHibernate調用沒有結果的存儲過程?
- 14. 如何對SQL Server CTE的結果執行存儲過程
- 15. 如何忽略觸發器中存儲過程的結果集?
- 16. 如何更改存儲過程中結果集的名稱
- 17. DB2存儲過程沒有返回結果集
- 18. Oracle存儲過程返回結果集
- 19. 從存儲過程得到結果集
- 20. 從存儲過程合併結果集
- 21. sql存儲過程清除結果集
- 22. 如何在RDLC報表中顯示存儲過程結果集行作爲列?
- 23. 根據存儲過程的結果對錶格進行排序
- 24. 在Codeigniter中有多個結果集的存儲過程
- 25. 如何將結果添加到MySQL存儲過程的結果集?
- 26. 如何存儲查詢結果在存儲過程
- 27. 如何將存儲過程的多個結果存儲到數據集中?
- 28. 如何存儲和迭代MySQL存儲過程中的結果集?
- 29. 如何讓sql server存儲過程結果在其他存儲過程中進行處理?
- 30. 存儲過程中的分組結果集
感謝您的回覆。 我的情況是在.NET 2.0和SQL Server 2000中(沒有linq和SQL Server 2005中的一些新功能)。 – 2009-08-25 14:35:49
這是不幸的,因爲CTE也僅在SQL Server 2005中引入:-( – 2009-08-25 16:40:59