12

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 行のみを返したいのですが、すべてのデータをプルバックしてからフィルター処理してユーザーに表示する必要はありません。これははるかに遅いためです。ありがとう。

4

5 に答える 5

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

お役に立てれば

于 2011-01-26T19:41:28.490 に答える
5

私は現在、永続化メカニズムとして SQL Server CE を使用する WPF アプリケーションにも取り組んでいます。いくつか (40 以上) のテーブルがあり、そのうちのいくつかはかなり大きい (50k レコード、少なくとも私の基準では大きい)。

SQL CE での直接のデータ ページングに関する私のアドバイスは次のとおりです。私は Bob King が説明したアプローチを使用しましたが、少なくとも私にとっては非常に醜いコードになり、メンテナンスの悪夢になりました。

何万ものレコードをページングする必要がない限り、SqlCeDataReaderを使用してすべてのレコードをカスタム クラスのコレクションに読み込み、メモリ内のコレクションをページングするのが最善の方法だと思います。このアプローチは、キャ​​ッシュを使用しても、毎回 SQL クエリを再実行するよりも応答性が高いことがわかりました。私の場合、クエリはかなり複雑で、SqlCeDataReader のパフォーマンスは十分に優れていたため、パフォーマンスへの影響はほとんど感じられませんでした。すべてがメモリに保持されるため、最初のバッチ読み込みの後、すべてのページ変更がほぼ瞬時に行われることを指摘する必要はありません。

私のユーザーの一般的な意見は、最初の結果が表示されるまでもう少し待っても問題ないというものでした。また、LINQ を使用すると、ページングは​​ Skip メソッドと Take メソッドを呼び出すのと同じくらい簡単です。このロジックを Pager<T> クラス内に実装したため、非常に DRY で優れたものになりました。

于 2009-11-04T03:35:30.360 に答える
2

正直なところ、おそらく最速の方法は、SqlCeDataReaderを使用して .Read() を 10 回呼び出すことです。その後、ユーザーが次のページに移動すると、既に 11 番目の結果を指していて、さらに 10 を読むことができます。前に戻る必要がある場合は、結果をキャッシュするか、 seek をサポートする SqlCeResultSet に切り替えることできます

また、SqlCeDataReader/Result は、経験上、デスクトップ上でデータベースを操作する絶対最速の方法です。DataSets/DataAdapter を使用するよりも文字通り 100 倍高速になります。

于 2009-08-06T15:12:14.580 に答える
1

SQL CE を使用してデータグリッドのカスタム ページングを実装しました。上記の回答で説明したように、selectステートメントでtopを使用し、サブクエリを使用してレコードをスキップする方法を実装しました。しかし、少量のデータでうまく機能します。レコードが千単位で増えると、上記の方法論は役に立たなくなり、パフォーマンスが低下します。

独自の手法を使用して、パフォーマンスの低下の問題を解決しました。私がしたことは、各ページの最初と最後のレコードの ID を変数に格納することです。

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

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

グリッドがすべてのページにバインドされた後、これらの変数を初期化します。

ユーザーが次のボタンをクリックすると、lastRecord より大きいデータベースから top(Pagsize) レコードを取得します ユーザーが前のボタンをクリックすると、firstRecord より小さいデータベースから top(PageSize) レコードを取得します。この場合も Id desc で注文します。そして、データグリッドにバインドする前に、dataview を使用してデータテーブルを asc に並べ替えます。

これにより、ページングが最も効率的になりました。レコードのケースの挿入と削除には、余分な労力を費やす必要がありましたが。しかし、私はそれを処理することができました。

于 2011-04-13T13:07:14.660 に答える
1

いくつかの方法がありますが、最も単純な方法は次のようなものです。

仮定

  1. ページ サイズ = 10
  2. ページ = 2

それで

  1. 最初の TOP = ページサイズ (10)
  2. 2 番目の TOP = ページサイズ * ページ (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
于 2010-10-23T02:05:36.977 に答える