SQL 更新文の記述
設計時には,SQL 更新エディタを使って DeleteSQL,InsertSQL,ModifySQL の各プロパティの 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 になります。