TADOTable使用にて大量のデータを表示する時の処理について

解決


mokuo  2006-12-18 22:17:17  No: 24292

初めましてmokuoといいます。
いつも参考にさせてもらっています。

TADOTable,DBGridを使用してデータベース内のデータを表示するツール
(テーブルブラウザみたいな)を作成しています。
TADOTable.Maxrecords=100とセットして表示速度を早くしたいと
考えていますが、DBGridレコード移動にてTADOTable.Maxrecordsに
達した場合に次の100レコードを読み出すにはどうしたらいいのでしょうか?
因みにレコード数は5万レコード超あるテーブルです。

[環境]
Delphi 6Profeesional
 [使用VCL]
  TADOConnection
  TADOTable
  TDBGrid 
 
解りずらい質問で申し訳ございませんが、
ご教授宜しくお願い致します。


HOta  2006-12-18 22:54:46  No: 24293

無制限に読むときは、TADOTable.Maxrecords=0ですね。
全てのレコードを表示するのは、設計上良くないのでは?
TADOQuery等で選択結果を表示した方が良いのでは?


えーとね  2006-12-19 00:31:30  No: 24294

CacheSize プロパティを設定したらどうでしょう。


mokuo  2006-12-19 09:39:53  No: 24295

HOtaさん、えーとねさん返答有難う御座います。

確かにHOtaさんの言う通りだと思います。
TADOQueryで取得したいところですが、以前にTADOQueryで作成して
あまりにも時間が掛かったので止めてしまった経緯があります、
Borland社もTableコンポーネントを推奨していないのも事実ですが・・・・
CashSizeプロパティについてチャレンジしてみます。

変更時の結果はお知らせしたいと考えております。
宜しくお願い致します。


HOta  2006-12-19 17:40:36  No: 24296

RDBMSを使うと、テーブルに、追加するのは時間がかかります。表示するのはかなり早くできます。目的に応じた方法を探さないと、だめと言うことでしょうね。


mokuo  2006-12-22 09:14:28  No: 24297

報告です。
DBはOracleなのでHOtaのいうとおりTADOQueryに変更し、
CacheSizeプロパティを設定してもこちらの思うような動きは出来ませんでした。
ExcuteOptionsプロパティについてもeoAsyncFetchを設定しましたが、
やはり期待する動きは実現出来ませんでした。
SQLにてOracleのヒント指定を使用してみましたがこれもNGでした。
大量なデータ(5万行位)になるとメモリーもそれなりに消費する為
別の方法を探すしかないようです。

いろいろと有難う御座いました。
解決ではありませんがこの件についてはクローズします。


mokuo  2007-02-10 12:50:54  No: 24298

前回解決としてクローズしましたが、その後いろいろ試してみたところ
以下の方法で期待していた動作が実現出来ましたので報告しておきます。

・TADOTable→TADOQueryに変更
   CacheSize=1
   CursorLocation=ulUseServer
・TDatasetProviderを追加
   DataSet=TADOQuery
・ClientDataSetを追加
   PacketRecords=50
   FetchOnDemand=True

ポイントはCursorLocationでしたが、最終行を読込んだ時には
やはりメモリの消費は避けられないようです。
あとClientDataSetでOnBeforeGetRecordsで保留されている更新がある場合の
処理等も追加してやらないと更新出来ない問題もありましたが、
工夫すればいいのでしょうがとりあえずOnBeforeGetRecordsで更新有無のメッセージを表示しました。

以上報告でした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加