SQL Server CE(精简版)中的数据分页

时间:2009-07-31 15:20:19

标签: sql-server-ce data-paging

我正在编写一个wpf destop应用程序,并希望使用SQL Server CE作为后端。我正在努力想出一个有效的数据分页方法。在SQL Server Express中,我可以这样做:

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行,而不是必须撤回所有数据,然后将其过滤掉以显示给用户,因为这样会慢得多。感谢。

5 个答案:

答案 0 :(得分:8)

如果有人到达此页面寻找答案...... 我发现了这篇文章:支持SQL Server CE 4.0中的分页查询

http://beyondrelational.com/blogs/jacob/archive/2010/07/13/support-for-paging-queries-in-sql-server-ce-4-0.aspx

希望这有帮助

答案 1 :(得分:5)

我目前正在开发一个使用SQL Server CE作为持久性机制的WPF应用程序。我们有几个(40+)表,其中一些非常大(50k记录,至少对我的标准来说很重要)。

我对SQL CE中直接进行数据分页的建议如下:如果可以,请避免使用它!我使用过Bob King描述的方法,至少在我看来它导致了非常丑陋的代码,真正的维护噩梦。

除非你需要翻阅数以万计的记录,否则我认为最好的方法是使用SqlCeDataReader将它们全部加载到自定义类的集合中,然后翻阅内存中的集合。我发现这种方法比每次重新执行SQL查询更具响应性,即使使用缓存也是如此。发生的事情是,在我的情况下,查询相当复杂,并且SqlCeDataReader的性能足够好,因此性能损失几乎难以察觉。无需指出,在第一次批量加载后,每次页面更改几乎都会立即发生,因为所有内容都保存在内存中。

我的用户的一般意见是,可以等待一段时间以显示第一个结果,如果这会导致之后更快的分页。使用LINQ,分页就像调用Skip和Take方法一样简单。我已经在Pager&lt; T&gt;中实现了这个逻辑。上课,让它非常干爽。

答案 2 :(得分:2)

老实说,可能最快的事情是使用SqlCeDataReader并调用.Read()10次。然后,当用户移动到下一页时,您已经指向第11个结果,并且可以再读取10个结果。如果您需要倒退,可以缓存结果或切换到支持SqlCeResultSetseeking

此外,从经验来看,SqlCeDataReader / Result是与桌面上的数据库交互的绝对最快的方式。它可以比使用DataSet / DataAdapter快100倍。

答案 3 :(得分:1)

有几种方法,但最简单的方法如下:

假设

  1. 页面大小= 10
  2. Page = 2
  3. 然后

    1. First TOP = PageSize(10)
    2. 第二个TOP = PageSize * Page(20)
    3. 
      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

答案 4 :(得分:1)

我确实使用SQL CE为datagrid实现了自定义分页。我实现了在select语句中使用top的方法,并使用子查询跳过记录,如上面的答案所述。但它适用于少量数据。随着记录增长千分之一,上述方法变得不那么有用,而且性能变慢。

我通过使用自己的技术解决了糟糕的性能问题。我所做的是我在变量中存储每页的第一个和最后一个记录的id。

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

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

在为每个页面绑定网格后,我会初始化这些变量。

如果用户单击下一步按钮,我将从大于lastRecord的数据库中获取top(Pagsize)记录  如果用户单击上一个按钮,我将从数据库中获取top(PageSize)记录,而不是firstRecord。此外,我在这种情况下通过Id desc订购。并在绑定到datagrid之前使用dataview将datatable重新排序为asc。

它使我的分页效率最高。虽然我不得不为记录案例的插入和删除付出额外的努力。但我能够处理它。