ソース データセットまたはドキュメントからのデータの要求
クライアント データセットでは、プロバイダからデータ パケットを取得する方法を制御することができます。デフォルトでは、ソース データセットからすべてのデータセットを取得します。これは、ソース データセットおよびプロバイダが、内部コンポーネント(TBDEClientDataSet、TSimpleDataSet、TIBClientDataSet など)である場合にも、TClientDataSet にデータを供給する別のコンポーネントである場合にも当てはまります。
クライアント データセットがレコードを取得する方法は、PacketRecords プロパティおよび FetchOnDemand プロパティを使用して変更できます。
インクリメンタルな取得
PacketRecords プロパティを変更することで、クライアント データセットが小さい塊でデータを取得するよう指定することができます。PacketRecords には、一度に取得するレコード数か、返すレコードの種類を指定します。デフォルトでは、PacketRecords は -1 に設定されています。これは、クライアント データセットが最初に開かれたときか、アプリケーションが明示的に GetNextPacket を呼び出したときに、使用可能な全レコードを一度に取得することを意味します。PacketRecords が -1 であれば、クライアント データセットが最初にデータを取得した後は、使用可能なレコードがすべて含まれているため、それ以上データを取得する必要はありません。
レコードをもっと小さい塊で取得するには、PacketRecords を取得するレコードの数に設定します。たとえば次の文では、各データ パケットのサイズを 10 レコードに設定しています。
ClientDataSet1.PacketRecords := 10;
ClientDataSet1->PacketRecords = 10;
このように何回かに分けてレコードを取得する方法を "インクリメンタルな取得" と呼びます。クライアント データセットでは、PacketRecords がゼロより大きい場合にインクリメンタルな取得を行います。
それぞれのレコードの塊を取得するには、クライアント データセットで GetNextPacket を呼び出します。新たに取得したパケットは、クライアント データセットに既に含まれているデータの末尾に追加されます。GetNextPacket は、取得したレコードの数を返します。戻り値が PacketRecords と同じであれば、使用可能なレコードの終わりにはまだ達していません。戻り値が 0 より大きく PacketRecords より小さい場合、取得操作中に最後のレコードに達しています。GetNextPacket から 0 が返された場合には、それ以上取得できるレコードはありません。
警告: ステートレス アプリケーション サーバー上のリモート プロバイダからデータを取得する場合には、インクリメンタルな取得を行うことができません。ステートレス リモート データ モジュールでインクリメンタルな取得を行う方法は、「リモート データ モジュールでの状態情報のサポート」を参照してください。
メモ: PacketRecords は、ソース データセットについてのメタデータ情報を取得するためにも使用できます。メタデータ情報を取得するには、PacketRecords を 0 に設定します。
オンデマンドでの取得
レコードの自動取得は、FetchOnDemand プロパティで制御します。FetchOnDemand が True(デフォルト)の場合、クライアント データセットは必要に応じて自動的にレコードを取得します。レコードの自動取得を行わないようにするには、FetchOnDemand を False に設定します。FetchOnDemand を False に設定すると、アプリケーションで明示的に GetNextPacket を呼び出してレコードを取得しなければなりません。
たとえば、非常に大規模な読み取り専用データセットを表示する必要のあるアプリケーションでは、FetchOnDemand をオフにして、メモリに収まる以上のデータをクライアント データセットが読み込まないようにすることができます。取得してから次の取得までの間に、クライアント データセットは EmptyDataSet メソッドを使用してキャッシュを解放します。ただし、この方法は、クライアントがサーバーに更新を登録しなければならない場合にはうまく機能しません。
データ パケット内のレコードに BLOB データやネストした詳細データセットを含めるかどうかは、プロバイダによって制御されます。プロバイダがこの情報をレコードから除外しているときに、FetchOnDemand プロパティをオンにすると、クライアント データセットは必要に応じて BLOB データと詳細データセットを自動的に取得します。FetchOnDemand が False, で、プロバイダがレコードに BLOB データや詳細データセットを含めていない場合には、FetchBlobs メソッドや FetchDetails メソッドを明示的に呼び出してこの情報を取得する必要があります。