3

DataGridView にロードしたい大規模なデータセット (100,000 レコード以上) があります。これを行うストアド プロシージャは、完了するまでに 10 秒以上かかる場合があります。

これまでのところ、UI がロックするのを防ぐ BackgroundWorker があり、初歩的な「お待ちください」ダイアログを実装しました。

私がやりたいのは、何らかの方法でデータベースから返された結果を DataGridView に入力することです。これを説明する最良の方法は、SQL Server Management Studio の動作です。クエリを実行すると、クエリがまだ実行中であっても、行がすぐに返されます。クエリを停止し、返された行を保持するボタンもあります。

自分のコードでこれを行うにはどうすればよいですか?

DataGridView はデータの行を表示するためにのみ使用され、ユーザーは 1 つをクリックして別のことを行います。データベースには何も書き戻されません。

4

5 に答える 5

4

データグリッドビューで 100,000 行? いやだっていうだけだよ"!

  1. ユーザーは一度に 100,000 行を表示できません
  2. 100,000 行を送信するためのネットワーク トラフィックは重要ではありません。
  3. 100,000 の datagridview 行のメモリ オーバーヘッドは重要ではありません
  4. ユーザーは 1 つの行を選択して続行するだけです。
  5. このアプリが一度に複数のユーザーによって使用された場合、DBA はあなたを追い詰めます

オースティンのアドバイスに従い、一度に 1 ページだけ表示する

于 2008-11-11T03:09:50.417 に答える
4

ある種のページング メカニズムを使用することが最善の選択肢のように思われるため、一度に一定量のデータのみをユーザーに表示します。これにより、データのプルとページの読み込みが高速化されます。GridView の組み込みのページングを使用できます (レコードのページのみを表示する場合でも、毎回データセット全体をプルするため、このアプローチでは .NET キャッシュを使用することをお勧めします)。一度に 1 ページのみを取得する LINQ to SQL を使用してページングを実装することもできます。以下は、その方法を説明している最近見つけた良い記事へのリンクです。

http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx

于 2008-11-10T22:27:09.427 に答える
2

他の人が示唆しているように、グリッドに 100K レコードを表示するのは悪い考えのように聞こえますが、本当に必要な場合は...

バックグラウンド ワーカー スレッドで正しい軌道に乗っていますが、データ リーダーを使用して、返された行を順番に読み取る必要があります。バックグラウンド ワーカー スレッドは、データ リーダーから行を読み取るたびに、グリッド行の追加を UI スレッドにマーシャリングする必要があります。

別のスレッドを使用して UI の応答性を維持することによる利点は、常に行を追加するために忙しくなるため、無効になることに注意してください。何らかのバッチ アプローチを実装し、UI に新しい行を 1 秒に 1 回程度だけ追加させることをお勧めします。ここでは細心の注意を払い、競合状態の可能性を念頭に置いてください。バックグラウンドワーカーが datareader から何らかのコレクションに行を追加している状況が発生する可能性があり、UI が同時にコレクションを読み取りたい場合があります。これはほぼ確実に問題を引き起こします。

于 2008-11-11T07:17:46.547 に答える
0

また、バックエンドのチューニングも検討する場合があります。このような場合にインデックスを追加すると、何度も助けられました。「実行計画」オプションを有効にして、SQL Server Management Studio からストアド プロシージャを実行してみてください。ストアド プロシージャが停止している可能性がある場所 (実行率が高い場所) を探します。項目にカーソルを合わせると、実行の詳細のリストが表示されます。リストの一番下で、比較されているフィールドがあるかどうかを確認します。これらは、索引付け候補にとって死んだ景品です。

于 2008-11-10T23:04:05.997 に答える
0

Management Studio と同じように、DataGridView でそれを実行できるとは思えません。ストアド プロシージャの呼び出しが完了すると、アプリ内のすべての行が一度に取得されると思います。

于 2008-11-10T22:14:51.697 に答える