MsiViewModify 関数 (msiquery.h)

MsiViewModify 関数は、フェッチされたレコードを更新します。

構文

UINT MsiViewModify(
  [in] MSIHANDLE hView,
  [in] MSIMODIFY eModifyMode,
  [in] MSIHANDLE hRecord
);

パラメーター

[in] hView

ビューへのハンドル。

[in] eModifyMode

変更モードを指定します。 このパラメーターには、次の値のいずれかを指定できます。

意味
MSIMODIFY_SEEK
-1
結果セット内の位置を変更せず、かつ後続のフェッチ操作に影響を与えずに、指定されたレコード内の情報を最新の情報に更新します。 その後、レコードは、後続の Update、Delete、Refresh に使用できます。 テーブルのすべての主キー列はクエリに含まれている必要があり、レコードにはクエリと同数以上のフィールドが必要です。 シークは、複数テーブル クエリでは使用できません。 このモードは、結合が含まれているビューでは使用できません。 解説も参照してください。
MSIMODIFY_REFRESH
0
レコード内の情報を最新の情報に更新します。 最初に、同じレコードを使用 して MsiViewFetch を呼び出す必要があります。 削除された行では失敗します。 読み取り/書き込みレコードと読み取り専用レコードで機能します。
MSIMODIFY_INSERT
1
レコードを挿入します。 同じ主キーを持つ行が存在する場合は、失敗します。 読み取り専用データベースでは失敗します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_UPDATE
2
既存のレコードを更新します。 非特権キーのみ。 最初に MsiViewFetch を呼び出す必要があります。 削除されたレコードでは失敗します。 読み取り/書き込みレコードでのみ機能します。
MSIMODIFY_ASSIGN
3
カーソル内の現在のデータをテーブル行に書き込みます。 主キーが既存の行と一致する場合は、レコードを更新し、一致しない場合は、挿入します。 読み取り専用データベースでは失敗します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_REPLACE
4
レコードを更新または削除し、テーブルにレコードを挿入します。 最初に、同じレコードを使用 して MsiViewFetch を呼び出す必要があります。 主キーが変更されていない場合は、レコードを更新します。 主キーが変更された場合は、古い行を削除し、新しい行を挿入します。 読み取り専用データベースでは失敗します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_MERGE
5
テーブル内のレコードを挿入または検証します。 主キーと一致する行がない場合は、挿入し、一致がある場合は、検証します。 レコードがテーブル内のデータと一致しない場合は、失敗します。 同じではない重複するキーを持つレコードがある場合は、失敗します。 読み取り/書き込みレコードでのみ機能します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_DELETE
6
テーブルから行を削除します。 最初に、同じレコードを使用して MsiViewFetch 関数を呼び出す必要があります。 行が削除された場合は、失敗します。 読み取り/書き込みレコードでのみ機能します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_INSERT_TEMPORARY
7
一時レコードを挿入します。 情報は永続的ではありません。 同じ主キーを持つ行が存在する場合は、失敗します。 読み取り/書き込みレコードでのみ機能します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_VALIDATE
8
レコードを検証します。 結合間では検証しません。 最初に、同じレコードを使用して MsiViewFetch 関数を呼び出す必要があります。 MsiViewGetError を使用して検証エラーを取得します。 読み取り/書き込みレコードと読み取り専用レコードで機能します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_VALIDATE_NEW
9
新しいレコードを検証します。 結合間では検証しません。 重複するキーをチェックします。 MsiViewGetError を呼び出して検証エラーを取得します。 読み取り/書き込みレコードと読み取り専用レコードで機能します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_VALIDATE_FIELD
10
フェッチされたレコードまたは新しいレコードのフィールドを検証します。 不完全なレコードの 1 つ以上のフィールドを検証できます。 MsiViewGetError を呼び出して検証エラーを取得します。 読み取り/書き込みレコードと読み取り専用レコードで機能します。 このモードは、結合が含まれているビューでは使用できません。
MSIMODIFY_VALIDATE_DELETE
11
後で削除されるレコードを検証します。 最初に MsiViewFetch を呼び出す必要があります。 別の行がこの行の主キーを参照している場合は、失敗します。 検証では、この行の主キーがプロパティまたは文字列に存在するかどうかをチェックしません。 列が複数のテーブルへの外部キーである場合は、チェックしません。 MsiViewGetError を呼び出して検証エラーを取得します。 読み取り/書き込みレコードと読み取り専用レコードで機能します。 このモードは、結合を含むビューでは使用できません。

[in] hRecord

変更するレコードを処理します。

戻り値

MsiViewModify 関数は、次の値を返します。

メモリ不足の状況では、この関数によってSTATUS_NO_MEMORY例外が発生する可能性があることに注意してください。

注釈

MsiViewModify 関数のMSIMODIFY_VALIDATE、MSIMODIFY_VALIDATE_NEW、MSIMODIFY_VALIDATE_FIELD、MSIMODIFY_VALIDATE_DELETEの値は、実際の更新を実行しません。レコード内のデータが有効であることを確認します。 これらの検証列挙を使用するには、データベースに _Validation テーブルが含まれている必要があります。

挿入または要求されたレコードの 0 番目のフィールドを変更していない場合は、MSIMODIFY_INSERT、MSIMODIFY_INSERT_TEMPORARY、またはMSIMODIFY_SEEKを使用した直後に、レコードでMSIMODIFY_UPDATEまたはMSIMODIFY_DELETEを呼び出すことができます。

SQL ステートメントを実行するには、ビューを作成する必要があります。 ただし、CREATE TABLE や INSERT INTO などの結果セットを作成しないビューを MsiViewModify と共に使用して、ビューを通じてテーブルを更新することはできません。

あるデータベースからバイナリ データを含むレコードをフェッチしてから、そのレコードを使用して別のデータベースにデータを挿入することはできません。 バイナリ データをあるデータベースから別のデータベースに移動するには、データをファイルにエクスポートし、クエリと MsiRecordSetStream を使用して新しいデータベースにインポートする必要があります。 これにより、各データベースがバイナリ データの独自のコピーを持つようになります。

カスタム アクションでは、データベースの一時行、列、またはテーブルのみを追加、変更、または削除できることに注意してください。 カスタム アクションでは、データベース内の永続的なデータを変更することはできません (例えば、ディスクに保存されているデータベースの一部であるデータなど)。 詳細については、「カスタム アクション内から現在のインストーラー セッションにアクセスする」を参照してください。

関数が失敗した場合は、 MsiGetLastErrorRecord を使用して拡張エラー情報を取得できます。

要件

要件
サポートされている最小のクライアント Windows Server 2012、Windows 8、Windows Server 2008 R2、または Windows 7 の Windows インストーラー 5.0。 Windows Server 2008 または Windows Vista の Windows インストーラー 4.0 または Windows インストーラー 4.5。 Windows Server 2003 または Windows XP の Windows インストーラー
対象プラットフォーム Windows
ヘッダー msiquery.h
Library Msi.lib
[DLL] Msi.dll

こちらもご覧ください

一般的なデータベース アクセス関数