データ パケットにカスタム情報を追加する

提供: RAD Studio
移動先: 案内検索

データ パケットに加える情報を制御する への移動


データセット プロバイダは、アプリケーション定義の情報を、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");
  // …
}

関連項目