更新の適用方法への影響
クライアントの更新要求への応答 への移動
データセット プロバイダは、OnUpdateData イベントを使用して、デルタ パケット内のレコードをどのようにデータベースに適用するかを指示することができます。
デフォルトで、デルタ パケット内の変更は、次のような自動生成された SQL UPDATE、INSERT、DELETE 文を使ってデータベースに書き込まれます。
UPDATE EMPLOYEES set EMPNO = 748, NAME = 'Smith', TITLE = 'Programmer 1', DEPT = 52 WHERE EMPNO = 748 and NAME = 'Smith' and TITLE = 'Programmer 1' and DEPT = 47
特に指定しない限り、デルタ パケット レコード内のフィールドはすべて、UPDATE 句や WHERE 句に含められます。ただし、一部のフィールドを除外したい場合もあります。その方法の 1 つは、プロバイダの UpdateMode プロパティを設定することです。UpdateMode には、以下のいずれかの値を割り当てることができます。
UpdateMode の値 :
値 | 意味 |
---|---|
upWhereAll |
フィールドの検索にすべてのフィールドを使用します(WHERE 句)。 |
upWhereChanged |
レコードの検索にキー フィールドと変更されたフィールドだけを使用します。 |
upWhereKeyOnly |
レコードの検索にキー フィールドだけを使用します。 |
また、さらに細かい制御が必要な場合もあります。たとえば先ほどの文で、EMPNO フィールドを UPDATE 句からはずしてそのフィールドが更新されないようにし、TITLE フィールドと DEPT フィールドを WHERE 句からはずして他のアプリケーションでデータが変更されたときに更新の競合が起きないようにしたいとします。特定のフィールドが含まれる句を指定するには、ProviderFlags プロパティを使用します。ProviderFlags は、次の表のいずれの値でも含むことのできるセットです。
ProviderFlags の値 :
値 | 説明 |
---|---|
pfInWhere |
フィールドは、UpdateMode が upWhereAll または upWhereChanged のときに、生成される INSERT、DELETE、または UPDATE 文の WHERE 句に含まれます。 |
pfInUpdate |
フィールドは、生成される UPDATE 文の UPDATE 句に含まれます。 |
pfInKey |
フィールドは、UpdateMode が upWhereKeyOnly のときに、生成される文の WHERE 句で使用されます。 |
pfHidden |
フィールドは、一意性を確保するためにレコードに含まれていますが、クライアント側で見たり使用することはできません。 |
次の OnUpdateData イベント ハンドラでは、これを使用して、TITLE フィールドを更新可能にし、EMPNO フィールドおよび DEPT フィールドを使って必要なレコードの検索を行っています。エラーが発生して、キーだけを元にレコードを検索するという第 2 の試みが行われる場合、生成される SQL では EMPNO フィールドのみを探します。
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); begin with DataSet do begin FieldByName('TITLE').ProviderFlags := [pfInUpdate]; FieldByName('EMPNO').ProviderFlags := [pfInWhere, pfInKey]; FieldByName('DEPT').ProviderFlags := [pfInWhere]; end; end;
void __fastcall TMyDataModule1::Provider1UpdateData(TObject *Sender, TCustomClientDataSet *DataSet) { DataSet->FieldByName("EMPNO")->ProviderFlags.Clear(); DataSet->FieldByName("EMPNO")->ProviderFlags << pfInWHere << pfInKey; DataSet->FieldByName("TITLE")->ProviderFlags.Clear(); DataSet->FieldByName("TITLE")->ProviderFlags << pfInUpdate; DataSet->FieldByName("DEPT")->ProviderFlags.Clear(); DataSet->FieldByName("DEPT")->ProviderFlags << pfInWhere; }
メモ: UpdateFlags プロパティを使用すると、データセットの更新時に動的に生成される SQL を使用しない場合でも、更新の適用方法を指定できます。これらのフラグも、レコードの検索にどのフィールドを使用するか、どのフィールドを更新するかを示します。