更新コンポーネントの Query プロパティの利用
更新文の実行:インデックス への移動
メモ: ボーランド データベース エンジン(BDE)の使用は推奨されません。今後 BDE は機能拡張されません。たとえば、BDE では Unicode がサポートされていません。BDE を使用して新たに開発しないことをお勧めします。既存のデータベース アプリケーションを BDE から dbExpress に移行することを検討してください。
更新コンポーネントの Query プロパティを使用すると、DeleteSQL 文、InsertSQL 文、および ModifySQL 文を実装する問い合わせコンポーネントにアクセスできます。ただし、これらの問い合わせで実行する文は、DeleteSQL、InsertSQL、ModifySQL の各プロパティを使って指定可能であり、その文の実行は、更新オブジェクトの 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; }