3

SQLServer2005に接続するADOを使用しています。

私のTADODataSetは100万レコードを選択します。TDBGridを使用し、を機能するように設定しTADODataSet.CursorLocationますclUseServer。しかし、TDBGridはチョークします!

100万レコードを選択し、ページングを回避し、すべてのレコードをクライアント側にフェッチせずにグリッドにレコードを表示して、グリッドを上下にスクロールしながら先読みできるようにするにはどうすればよいですか?

SQL Enterprise Managerは、クエリを実行し、問題なく非同期で100万レコードを選択できます(MS-ACCESSも)。

4

3 に答える 3

1
  • なぜ100万レコードをグリッドにフェッチする必要があるのですか?人間はこれほど多くの記録を見ることができません。通常、UIにロードする前にレコードの数を減らす方がはるかに優れています。
  • 非常に多くのレコードをグリッドに表示する正当な理由がある場合は、1)開いたときにレコードセット全体をロードしない2)前のレコードをキャッシュしないか、メモリが不足する可能性があるデータセットが必要になります(レコードサイズが十分に小さくない場合は、レコードセットの最後に到達するずっと前に、特に32ビットWindows)。CursorLocationを超えてこのような結果を取得するには、CursorTypeとCacheSizeを適切に設定する必要があります。
  • TClientDatasetを使用して、増分フェッチを実装し、ADOデータセットのCursorTypeをForwardOnlyに、CacheSizeを適切な値に設定できます。TClientDatasetは読み取りレコードをキャッシュするため、ソースデータセットがそれらすべてをロードすることを回避する必要があります。標準のDBグリッドには双方向カーソルが必要であるため、単方向カーソルでは機能しません。非常に多くのレコードがあるため、クライアントデータセットキャッシュはとにかくメモリを使い果たす可能性があります。2010より前のDelphiバージョンを使用している場合は、 MidasSpeedFixユニットを使用することをお勧めします。
  • 「メモリ不足」エラーを回避するには、ある種のページ付けを実装する必要がある場合があります。とにかく、他のCursorTypeの動作が役立つかどうかを確認してください。
于 2011-12-17T23:34:34.223 に答える
1

TGridはあなたの問題ではありません。問題は、TADODatasetがすべてのレコードを読み込もうとしていることです。非常に多くのレコードを返すクエリを実行する必要がある場合は、ExecuteOptionsを設定し、eoAsyncExecuteとeoAsyncFetchを試してください。CacheSizeを設定することも役立つ場合があります。

于 2011-12-18T01:06:58.330 に答える
0

AnyDACとTADTableを試すことができます。そのライブデータウィンドウモードは、あなたと同様の問題を解決します。利点は次のとおりです。

  • 単方向データセットと同様に、メモリ使用量を最小限に抑え、大量のデータを処理できます。
  • 一方向のデータセットとは対照的に、双方向のナビゲーションを可能にします。
  • 常に新鮮なデータを提供し、データセットを更新する必要性を減らします。
  • 並べ替え、レコードの場所、最後のレコードへのジャンプなどを実行するために必要な、すべての結果セットレコードのフェッチを遅らせることはありません。
于 2011-12-18T08:31:33.573 に答える