更新コンポーネントの Query プロパティの利用

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

更新文の実行:インデックス への移動

メモ: ボーランド データベース エンジン(BDE)の使用は推奨されません。今後 BDE は機能拡張されません。たとえば、BDE では Unicode がサポートされていません。BDE を使用して新たに開発しないことをお勧めします。既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。

更新コンポーネントの Query プロパティを使用すると、DeleteSQL 文、InsertSQL 文、および ModifySQL 文を実装する問い合わせコンポーネントにアクセスできます。ただし、これらの問い合わせで実行する文は、DeleteSQLInsertSQLModifySQL の各プロパティを使って指定可能であり、その文の実行は、更新オブジェクトの Apply メソッドまたは ExecSQL メソッドを呼び出すことによって可能なため、ほとんどのアプリケーションでは、これらの問い合わせコンポーネントに直接アクセスする必要はありません。しかし、問い合わせコンポーネントを直接操作することが必要な場合もあります。特に、更新オブジェクトが持つ、新旧の項目値へのパラメータの自動結合機能を利用するのではなく、SQL 文のパラメータを独自に指定する場合などには、Query プロパティを使用することができます。

メモ:  Query プロパティには、実行時にのみアクセスできます。

Query プロパティは、TUpdateKind の値を基にしてインデックスが付けられます。

  • インデックス ukModify を使用すると、既存レコードを更新する問い合わせにアクセスします。
  • インデックス ukInsert を使用すると、新規レコードを挿入する問い合わせにアクセスします。
  • インデックス ukDelete を使用すると、レコードを削除する問い合わせにアクセスします。

以下に、自動的に結合することのできないパラメータ値を、Query プロパティを使って指定する方法を示します。

procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet;
          DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
begin
  UpdateSQL1.DataSet := DeltaDS; { パラメータの自動置換に必要 }
  with UpdateSQL1.Query[UpdateKind] do
  begin
    { 問い合わせが正しい DatabaseName と SessionName を持つようにする }
    DatabaseName := (SourceDS as TDBDataSet).DatabaseName;
    SessionName := (SourceDS as TDBDataSet).SessionName;
    ParamByName('TimeOfUpdate').Value = Now;
  end;
  UpdateSQL1.Apply(UpdateKind); { ここで自動置換して実行 }
  Applied := True;
end;
void __fastcall TForm1::BDEClientDataSet1BeforeUpdateRecord(TObject *Sender,
   TDataSet *SourceDS, TCustomClientDataSet *DeltaDS, TUpdateKind UpdateKind, bool &Applied)
{
  UpdateSQL1->DataSet = DeltaDS; // パラメータの自動置換に必要
  TQuery *pQuery = UpdateSQL1->Query[UpdateKind]; // クエリーへのアクセス
  // クエリーが正しい DatabaseName と SessionName を持つようにする
  TDBDataSet *pSrcDS = dynamic_cast<TDBDataSet *>(SourceDS);
  pQuery->DatabaseName = pSrcDS->DatabaseName;
  pQuery->SessionName = pSrcDS->SessionName;
  // ここでカスタムパラメータの値を代入
  pQuery->ParamByName("TimeOfLastUpdate")->Value = Now();
  UpdateSQL1->Apply(UpdateKind); // ここで自動代入と実行を行う
  Applied = true;
}


関連項目