正在看.NET中資料訪問,關於分頁技術,有些好奇。本來以為可以像ADO一樣,使用遊標的方法,後來發現是不行的。在網路上面搜尋了一下,大部分的推薦是用預存程序。從微軟的技術文檔中看到以下文字,記錄在這裡,供以後工作參考。
引用文檔地址:http://www.microsoft.com/china/MSDN/library/data/dataAccess/BestPractiCEs%20forUsingADO.NET.mspx
ADO.NET 可以顯式控制從資料來源中返回什麼樣的資料,以及在 DataSet 中本機快取多少資料。對查詢結果的分頁沒有唯一的答案,但下面有一些設計應用程式時應該考慮的技巧。
|
避免使用帶有 startRecord 和 maxRecords 值的 DataAdapter.Fill 重載。當以這種方式填充 DataSet 時,只有 maxRecords 參數(從 startRecord 參數標識的記錄開始)指定的記錄數量用於填充 DataSet,但無論如何總是返回完整的查詢。這就會引起不必要的處理,用於讀取“不需要的”記錄;而且為了返回附加記錄,會耗盡不必要的伺服器資源。
(本來以為這樣做就可以,現在才知道不行,真是想不通為什麼ADO.NET不提供這樣的支援。) |
|
用於每次只返回一頁記錄的技術是建立 SQL 陳述式,把 WHERE 子句以及 ORDER BY 子句和 TOP 謂片語合起來。此技術取決於存在一種可唯一標識每一行的辦法。當瀏覽下一頁記錄時,修改 WHERE 子句使之包含所有唯一識別碼大於當前頁最後一個唯一識別碼的記錄。當瀏覽上一頁記錄時,修改 WHERE 子句使之返回所有唯一識別碼小於當前頁第一個唯一識別碼的記錄。兩種查詢都只返回記錄的 TOP 頁。當瀏覽上一頁時,需要以降序為結果排序。這將有效地返回查詢的最後一頁(如果需要,顯示之前也許要重新排序結果)。有關這個技術的一個樣本,請參閱 Paging Through a Query Result。
(這個說法和微軟的另一篇文章,.NET 資料訪問體繫結構指南,是一致的。) |
|
另一項每次只返回一頁記錄的技術是建立 SQL 陳述式,把 TOP 謂詞和嵌入式 SELECT 語句的使用結合在一起。此技術並不依賴於存在一種可唯一標識每一行的辦法。使用這項技術的第一步是把所需頁的數量與頁大小相乘。然後將結果傳遞給 SQL Query 的 TOP 謂詞,該查詢以升序排列。再把此查詢嵌入到另一個查詢中,後者從降序排列的嵌入式查詢結果中選擇 TOP 頁大小。實質上,返回的是嵌入式查詢的最後一頁。例如,要返回查詢結果的第三頁(頁大小是 10),應該書寫如下所示的命令:
SELECT TOP 10 * FROM (SELECT TOP 30 * FROM Customers ORDER BY Id ASC) AS Table1ORDER BY Id DESC
注意,從查詢中返回的結果頁以降序顯示。如果需要,應該重新排序。
(這個也比較好,估計我以後寫程式會採用類似的做法。) |
|
如果資料不經常變動,可以在 DataSet 中本地維護一個記錄緩衝,以此提高效能。例如,可以在本地 DataSet 中儲存 10 頁有用的資料,並且只有當使用者瀏覽超出緩衝第一頁和最後一頁時,才從資料來源中查詢新資料。 |