データ パケットにカスタム情報を追加する
データ パケットに加える情報を制御する への移動
データセット プロバイダは、アプリケーション定義の情報を、Datasnap.Provider.TDataSetProvider.OnGetDataSetProperties イベントを使用して、データ パケットに追加できます。この情報は、OleVariant としてエンコードされ、指定された名前で保存されます。クライアント データセットはその後、GetOptionalParam メソッドを使用して、この情報を取得することができます。また、レコード更新時に、クライアント データセットが送信した差分パケットに、この情報が含まれるように指定することもできます。この場合、クライアント データセットは、この情報について一切関知しませんが、プロバイダは、自分自身への往復メッセージを送信することができます。
カスタム情報を OnGetDataSetProperties イベントに追加する際、各個別の属性(場合により、「任意パラメータ」と呼ばれる)は、次の 3 つの要素を含む Variant 配列を使用して指定されます:名前(文字列)、値(Variant)、ブーリアン フラグ(クライアントが更新を適用する際に、差分パケットに情報を含めるか否かを示すフラグ)。複数の属性を追加するには、Variant 配列を要素に持つ Variant 配列を作成します。たとえば、次の OnGetDataSetProperties イベント ハンドラは、2 つの値、データが提供される時間とソース データセット内のレコードの総数を送信します。クライアント データセットが更新を適用した際、データが提供される時間のみが返されます:
procedure TMyDataModule1.Provider1GetDataSetProperties(Sender: TObject; DataSet: TDataSet; out Properties: OleVariant); begin Properties := VarArrayCreate([0,1], varVariant); Properties[0] := VarArrayOf(['TimeProvided', Now, True]); Properties[1] := VarArrayOf(['TableSize', DataSet.RecordCount, False]); end;
void __fastcall TMyDataModule1::Provider1GetDataSetProperties(TObject *Sender, TDataSet *DataSet, out OleVariant Properties) { int ArrayBounds[2]; ArrayBounds[0] = 0; ArrayBounds[1] = 1; Properties = VarArrayCreate(ArrayBounds, 1, varVariant); Variant values[3]; values[0] = Variant("TimeProvided"); values[1] = Variant(Now()); values[2] = Variant(true); Properties[0] = VarArrayOf(values,2); values[0] = Variant("TableSize"); values[1] = Variant(DataSet->RecordCount); values[2] = Variant(false); Properties[1] = VarArrayOf(values,2); }
クライアント データセットが更新を適用すると、元のレコードが提供された時間が、プロバイダの Provider.TDataSetProvider.OnUpdate イベントで読み取ることができます:
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); var WhenProvided: TDateTime; begin WhenProvided := DataSet.GetOptionalParam('TimeProvided'); ... end;
void __fastcall TMyDataModule1::Provider1UpdateData(TObject *Sender, TCustomClientDataSet *DataSet) { Variant WhenProvided = DataSet->GetOptionalParam("TimeProvided"); ... }