2009-07-31 60 views
12

我正在寫一個wpf destop應用程序,並希望將SQL Server CE用作後端。我試圖想出一個有效的數據分頁的好方法。在SQL Server Express中,我可以這樣做:SQL Server CE中的數據分頁(精簡版)

Select ID, FirstName, LastName 
From (SELECT ROW_NUMBER() OVER (ORDER BY ID) 
AS Row, ID, FirstName, LastName 
From TestTable        
) 
WHERE Row > 1 AND Row <= 10  

SQL Server CE中有什麼可比較的嗎?我不完全確定什麼是和不支持。我只想從數據庫中一次只返回10行,而不必將所有數據回收,然後將其過濾以顯示給用戶,因爲這要慢得多。謝謝。

+0

尼爾,看到我對我的答案的評論。 – 2009-08-08 22:46:21

回答

2

老實說,可能最快的做法是使用SqlCeDataReader並調用.Read()10次。然後,當用戶移動到下一頁時,您已經指向了第11個結果,並且可以讀取10個結果。如果您需要向後退出,則可以緩存結果或切換到支持seekingSqlCeResultSet

此外,從經驗中,SqlCeDataReader/Result是與桌面上的數據庫交互的絕對最快的方式。它可以比使用DataSets/DataAdapters快100倍。

+0

SqlCeResultSet是否一次從數據庫中撤回結果集中的所有內容(如斷開連接的DataSet),還是隻是打開與數據庫的連接並根據請求讀取行? 如果它留下來打開數據庫的連接,也許我可以使用SqlCeResultSet和ReadAbsolute相結合的方法跳轉到我需要的記錄,將它們讀入一個列表,然後返回列表,並關閉連接。 – Neil 2009-08-07 13:16:55

+1

@Neil,ResultSet/DataReader需要一個持久連接。對於所有意圖和目的,它們幾乎都只是一個SQL遊標。特別好的是,你也可以打開整個表格作爲TableDirect,給它一個索引,然後在那個索引上查找,它的* so *很快。 – 2009-08-08 22:45:24

5

我目前也在使用SQL Server CE作爲持久性機制的WPF應用程序。我們有幾張(40+)桌子,其中一些桌子非常大(5萬條記錄,至少對我的標準來說這很重要)。

關於直接在SQL CE中進行數據分頁的建議是這樣的:如果可以的話,就避免它!我使用了Bob King所描述的方法,至少對我而言,它導致了非常醜陋的代碼,這是一個真正的維護噩夢。

除非您需要遍歷數萬條記錄,否則我相信最好的方法是將它們全部使用SqlCeDataReader加載到自定義類的集合中,然後遍歷內存中的集合。我發現這種方法比每次重新執行SQL查詢都更有反應,即使使用緩存也是如此。發生的事情是,在我的情況下,查詢相當複雜,並且SqlCeDataReader性能足夠好,因此性能幾乎不可察覺。沒有必要指出,在第一批加載之後,每個頁面更改幾乎是瞬間發生,因爲所有內容都保存在內存中。

我的用戶的一般觀點是,如果這會導致後續更快的分頁,可以等待一段時間才能顯示第一個結果。使用LINQ,分頁就像調用Skip和Take方法一樣簡單。我已經在尋呼機內部實現了這個邏輯,使它非常乾燥和美觀。

1

有幾種方法,但最簡單的方法是這樣的:

假設

  1. 頁面大小= 10
  2. 頁= 2

然後

  1. 第一個TOP = Pa geSize(10)
  2. 第二頂=每頁*頁(20)

SELECT 
[Page].[ID], 
[Page].[FirstName], 
[Page].[LastName] 
FROM 
(
SELECT TOP (10) 
[FirstRows].[ID], 
[FirstRows].[FirstName], 
[FirstRows].[LastName] 
FROM 
(
SELECT TOP (20) 
    [TestTable].[ID], 
    [TestTable].[FirstName], 
    [TestTable].[LastName] 
FROM 
    [TestTable] 
ORDER BY 
    [TestTable].[ID] ASC 
) AS [FirstRows] 
ORDER BY 
[FirstRows].[ID] DESC 
) AS [Page] 
ORDER BY 
    [Page].[ID] ASC
1

我做IMPL使用SQL CE對數據網格進行自定義分頁。我實現了在select語句中使用top並在上面的答案中討論的使用子查詢跳過記錄的方法。但是對於少量數據來說,它效果很好。隨着記錄數量的增長,上述方法變得不太有用,並且性能變慢。

我使用自己的技術解決了性能不佳的問題。我所做的是我在變量中的每個頁面上存儲第一個和最後一個記錄的id。

dim firstRecord=dt.rows(0)("id") 

dim lastRecord=dt.Rows(dt.rows.count-1)("id") 

我初始化這些變量網格綁定的每一頁後。

如果用戶點擊下一步按鈕我從數據庫獲取頂部(Pagsize)記錄大於lastRecord 如果用戶點擊上一個按鈕,我從數據庫中獲取頂部(PageSize)記錄少於firstRecord。在這種情況下,我也通過Id desc訂購。在綁定到datagrid之前,使用dataview將datatable重新排序爲asc。

它使我的分頁效率最高。雖然我不得不花費額外的努力插入和刪除記錄案例。但我能夠解決這個問題。

相關問題