初めましてmokuoといいます。
いつも参考にさせてもらっています。
TADOTable,DBGridを使用してデータベース内のデータを表示するツール
(テーブルブラウザみたいな)を作成しています。
TADOTable.Maxrecords=100とセットして表示速度を早くしたいと
考えていますが、DBGridレコード移動にてTADOTable.Maxrecordsに
達した場合に次の100レコードを読み出すにはどうしたらいいのでしょうか?
因みにレコード数は5万レコード超あるテーブルです。
[環境]
Delphi 6Profeesional
[使用VCL]
TADOConnection
TADOTable
TDBGrid
解りずらい質問で申し訳ございませんが、
ご教授宜しくお願い致します。
無制限に読むときは、TADOTable.Maxrecords=0ですね。
全てのレコードを表示するのは、設計上良くないのでは?
TADOQuery等で選択結果を表示した方が良いのでは?
CacheSize プロパティを設定したらどうでしょう。
HOtaさん、えーとねさん返答有難う御座います。
確かにHOtaさんの言う通りだと思います。
TADOQueryで取得したいところですが、以前にTADOQueryで作成して
あまりにも時間が掛かったので止めてしまった経緯があります、
Borland社もTableコンポーネントを推奨していないのも事実ですが・・・・
CashSizeプロパティについてチャレンジしてみます。
変更時の結果はお知らせしたいと考えております。
宜しくお願い致します。
RDBMSを使うと、テーブルに、追加するのは時間がかかります。表示するのはかなり早くできます。目的に応じた方法を探さないと、だめと言うことでしょうね。
報告です。
DBはOracleなのでHOtaのいうとおりTADOQueryに変更し、
CacheSizeプロパティを設定してもこちらの思うような動きは出来ませんでした。
ExcuteOptionsプロパティについてもeoAsyncFetchを設定しましたが、
やはり期待する動きは実現出来ませんでした。
SQLにてOracleのヒント指定を使用してみましたがこれもNGでした。
大量なデータ(5万行位)になるとメモリーもそれなりに消費する為
別の方法を探すしかないようです。
いろいろと有難う御座いました。
解決ではありませんがこの件についてはクローズします。
前回解決としてクローズしましたが、その後いろいろ試してみたところ
以下の方法で期待していた動作が実現出来ましたので報告しておきます。
・TADOTable→TADOQueryに変更
CacheSize=1
CursorLocation=ulUseServer
・TDatasetProviderを追加
DataSet=TADOQuery
・ClientDataSetを追加
PacketRecords=50
FetchOnDemand=True
ポイントはCursorLocationでしたが、最終行を読込んだ時には
やはりメモリの消費は避けられないようです。
あとClientDataSetでOnBeforeGetRecordsで保留されている更新がある場合の
処理等も追加してやらないと更新出来ない問題もありましたが、
工夫すればいいのでしょうがとりあえずOnBeforeGetRecordsで更新有無のメッセージを表示しました。
以上報告でした。
ツイート | ![]() |