msiviewModify 函数 (msiquery.h)

MsiViewModify 函数更新提取的记录。

语法

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

参数

[in] hView

视图的句柄。

[in] eModifyMode

指定修改模式。 此参数的取值可为下列值之一:

含义
MSIMODIFY_SEEK
-1
刷新所提供记录中的信息,但不更改结果集中的位置,且不影响后续的提取操作。 然后,该记录可用于后续的更新、删除和刷新。 表的所有主键列都必须位于查询中,并且记录的字段数必须至少与查询一样多。 Seek 不能与多表查询一起使用。 此模式不能与包含联接的视图一起使用。 另请参阅备注。
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
验证已提取的记录或新记录的字段。 可以验证不完整记录的一个或多个字段。 通过调用 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表

使用MSIMODIFY_INSERT、MSIMODIFY_INSERT_TEMPORARY或MSIMODIFY_SEEK后,可以立即使用记录调用MSIMODIFY_UPDATE或MSIMODIFY_DELETE,前提是未修改插入或已查询记录的第 0 个字段。

若要执行任何 SQL 语句,必须创建一个视图。 但是,不创建结果集的视图(如 CREATE TABLE 或 INSERT INTO)不能与 MsiViewModify 一起使用,以便通过视图更新表。

不能从一个数据库提取包含二进制数据的记录,然后使用该记录将数据插入另一个数据库。 若要将二进制数据从一个数据库移到另一个数据库,应将数据导出到文件,然后使用查询和 MsiRecordSetStream 将其导入新数据库。 这可以确保每个数据库都有自身的二进制数据副本。

请注意,自定义操作只能添加、修改或删除数据库中的临时行、列或表。 自定义操作无法修改数据库中的永久性数据,例如,作为存储在磁盘上的数据库的一部分的数据。 有关详细信息,请参阅从自定义操作内部访问当前安装程序会话

如果函数失败,可以使用 MsiGetLastErrorRecord 获取扩展错误信息。

要求

要求
最低受支持的客户端 Windows Server 2012、Windows 8、Windows Server 2008 R2 或 Windows 7 上的 Windows Installer 5.0。 Windows Server 2008 或 Windows Vista 上的 Windows Installer 4.0 或 Windows Installer 4.5。 Windows Server 2003 或 Windows XP 上的 Windows Installer
目标平台 Windows
标头 msiquery.h
Library Msi.lib
DLL Msi.dll

另请参阅

常规数据库访问函数