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