我正在编写一个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行,而不是必须撤回所有数据,然后将其过滤掉以显示给用户,因为这样会慢得多。感谢。
答案 0 :(得分:8)
如果有人到达此页面寻找答案...... 我发现了这篇文章:支持SQL Server CE 4.0中的分页查询
希望这有帮助
答案 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个结果。如果您需要倒退,可以缓存结果或切换到支持SqlCeResultSet的seeking。
此外,从经验来看,SqlCeDataReader / Result是与桌面上的数据库交互的绝对最快的方式。它可以比使用DataSet / DataAdapter快100倍。
答案 3 :(得分:1)
有几种方法,但最简单的方法如下:
假设
然后
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。
它使我的分页效率最高。虽然我不得不为记录案例的插入和删除付出额外的努力。但我能够处理它。