SQL 更新文の記述

提供:RAD Studio (日本語)
移動: 案内, 検索

設計時には,SQL 更新エディタを使って DeleteSQLInsertSQLModifySQL の各プロパティの SQL 文を記述することができます。SQL 更新エディタを使用しないときや,生成された文を修正するときは,以下で述べる要領にしたがって,ベーステーブル内のレコードを削除,挿入,または変更する文を記述してください。

DeleteSQL プロパティは,DELETE コマンドを使った SQL 文だけを含んでいる必要があります。更新対象のベーステーブル名を FROM 節に指定する必要があります。アップデートキャッシュ内で削除されたレコードに対応するベーステーブル内のレコードだけを削除するには,SQL 文で WHERE 節を使用します。WHERE 節のパラメータとして,キャッシュアップデートレコードに対応するベーステーブル内のレコードをユニークに識別するための 1 つまたは複数の項目を使用します。項目名の頭に「OLD_」を付けたのと同じ名前のパラメータならば,キャッシュアップデートレコードの対応する項目からそのパラメータに自動的に値が割り当てられます。パラメータの名前がそれ以外ならば,自分でパラメータ値を指定する必要があります。

DELETE FROM Inventory I
WHERE (I.ItemNo = :OLD_ItemNo)

テーブルの種類によっては,レコードの識別に使用される項目がヌル値のときにベーステーブル内でレコードを見つけられません。その場合,それらのレコードの削除更新は失敗します。これに対処するため,NULL を含む可能性のある項目について,IS NULL 述語を使って条件を追加します(NULL 以外の値の場合の条件に加えて)。たとえば,FirstName 項目の値が NULL のことがある場合,次のようにします。

DELETE FROM Names
WHERE (LastName = :OLD_LastName) AND
  ((FirstName = :OLD_FirstName) OR (FirstName IS NULL))

InsertSQL 文は,INSERT コマンドを使った SQL 文だけで構成する必要があります。更新対象のベーステーブルの名前を INTO 節で指定する必要があります。VALUES 節には,パラメータをカンマで区切ったリストを指定します。パラメータ名が項目名と同じならば,パラメータにはキャッシュアップデートレコードから自動的に値が割り当てられます。パラメータの名前がそれ以外ならば,自分でパラメータ値を指定する必要があります。パラメータのリストは,新規挿入レコードの項目値を指定します。文の中でリストされている項目の数と同じ数の値パラメータが存在する必要があります。

INSERT INTO Inventory
(ItemNo, Amount)
VALUES (:ItemNo, 0)

ModifySQL 文は,UPDATE コマンドを使った SQL 文だけで構成する必要があります。更新対象のベーステーブル名を FROM 節に指定する必要があります。SET 節で 1 つまたは複数の値を割り当てます。SET 節で割り当てた値が,項目と同じパラメータ名ならば,パラメータには自動的にキャッシュ内の更新レコード内の同名項目から値が割り当てられます。どの項目名とも名前が一致しないほかのパラメータ名を使用して,項目値を追加で割り当てることもできます。ただし,この値は自分で手入力で指定する必要があります。DeleteSQL 文と同様に,更新対象のベーステーブル内でレコードをユニークに識別するために,項目名の頭に "OLD_" を付けたパラメータ名を使って WHERE 節を指定します。次の更新文では,パラメータ :ItemNo には自動的に値が割り当てられますが,:Price は自動的ではありません。

UPDATE Inventory I
SET I.ItemNo = :ItemNo, Amount = :Price
WHERE (I.ItemNo = :OLD_ItemNo)

上の SQL で,アプリケーションのエンドユーザーが既存のレコードを変更する場合を例として考えてみましょう。ItemNo 項目の元の値は 999 です。キャッシュデータセットに接続されたグリッドで,エンドユーザーは ItemNo 項目の値を 123 に,Amount を 20 に変えました。ApplyUpdates メソッドが呼び出されると,この SQL 文は,:OLD_ItemNo パラメータで古い項目値を使用するので,ベーステーブル内で ItemNo 項目が 999 のすべてのレコードに影響します。これらのレコードで,ItemNo 項目の値は 123 になり(:ItemNo パラメータを使用,値はグリッドから),Amount は 20 になります。

関連リンク

他言語版