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

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

BDE の利用:インデックス への移動


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

更新コンポーネントの ExecSQL メソッドでは、現在のレコードに対して更新を手動で適用します。 Apply メソッドと異なり、ExecSQL は、実行する前に SQL 文のパラメータをバインドしません。 ExecSQL メソッドが一番よく呼び出されるのは、OnUpdateRecord イベント(BDE 使用時)または BeforeUpdateRecord イベント(クライアント データセット使用時)に対するハンドラ内からです。

ExecSQL はパラメータ値をバインドしないので、更新オブジェクトの SQL 文にパラメータが含まれないとき、主に使用されます。 パラメータがないときでも、代わりに Apply を使用できます。ただし ExecSQL の方が効率的です。パラメータをチェックしないからです。

SQL 文にパラメータが含まれる場合でも、ExecSQL を呼び出すことができますが、明示的にパラメータをバインドした後だけです。 BDE を使用して更新をキャッシュする場合は、更新オブジェクトの DataSet プロパティを設定してから、SetParams メソッドを呼び出すことによって、明示的にパラメータをバインドできます。 クライアント データセットを使用して更新をキャッシュするときは、TUpdateSQL で管理されるベースのクエリ オブジェクトにパラメータを渡す必要があります。 実行方法について詳細は、「更新コンポーネントの Query プロパティの利用」を参照してください。

警告: データセットの UpdateObject プロパティを使用して、データセットと更新オブジェクトを関連付ける場合は、ExecSQL が自動的に呼び出されます。 この場合は、ExecSQLOnUpdateRecord または BeforeUpdateRecord イベント ハンドラから呼び出さないでください。結果として、現在のレコードの更新を適用するように 2 回目も試行するからです。

OnUpdateRecordBeforeUpdateRecord イベント ハンドラでは、型 TUpdateKindUpdateKind パラメータで適用する必要がある更新の型を示します。 このパラメータを ExecSQL メソッドに渡して、使用する更新 SQL 文の対象を示す必要があります。 以下のコードは BeforeUpdateRecord イベント ハンドラを使用した例です。

procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet;
          DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
begin
  with UpdateSQL1 do
  begin
    DatabaseName := (SourceDS as TDBDataSet).DatabaseName;
    SessionName := (SourceDS as TDBDataSet).SessionName;
    ExecSQL(UpdateKind);
    Applied := True;
  end;
end;
void __fastcall TForm1::BDEClientDataSet1BeforeUpdateRecord(TObject *Sender,
   TDataSet *SourceDS, TCustomClientDataSet *DeltaDS, TUpdateKind UpdateKind, bool &Applied)
{
  TDBDataSet *pSrcDS = dynamic_cast<TDBDataSet *>(SourceDS);
  UpdateSQL1->DatabaseName = pSrcDS->DatabaseName;
  UpdateSQL1->SessionName = pSrcDS->SessionName;
  UpdateSQL1->ExecSQL(UpdateKind);
  Applied = true;
}

更新プログラムの実行中に例外が発生する場合は、OnUpdateError イベント(定義されている場合)で実行が継続されます。

関連項目


トピック