MsiDatabaseMergeA 函数 (msiquery.h)

MsiDatabaseMerge 函数将两个数据库合并在一起,从而允许重复行。

语法

UINT MsiDatabaseMergeA(
  [in] MSIHANDLE hDatabase,
  [in] MSIHANDLE hDatabaseMerge,
  [in] LPCSTR    szTableName
);

参数

[in] hDatabase

MsiOpenDatabase获取的数据库句柄。

[in] hDatabaseMerge

MsiOpenDatabase 获取的数据库的句柄 合并到基本数据库中。

[in] szTableName

要接收合并冲突信息的表的名称。

返回值

MsiDatabaseMerge 函数返回以下值之一:

返回代码 描述
ERROR_FUNCTION_FAILED
报告了行合并冲突。
ERROR_INVALID_HANDLE
提供了无效或非活动句柄。
ERROR_INVALID_TABLE
提供了无效表。
ERROR_SUCCESS
函数成功。
ERROR_DATATYPE_MISMATCH
两个数据库的架构差异。

言论

MsiDatabaseMerge 函数和 Merge 方法的 Database 对象不能用于合并安装包中包含的模块。 不应使用它们将 合并模块 合并到 Windows Installer 包中。 若要在安装包中包含合并模块,安装包的作者应遵循 应用合并模块 主题中所述的准则。

MsiDatabaseMerge 不会复制嵌入的 内阁文件嵌入转换 从引用数据库复制到目标数据库。 二进制表图标表 中列出的嵌入数据流将从引用数据库复制到目标数据库。 引用数据库中嵌入的存储不会复制到目标数据库。

MsiDatabaseMerge 函数合并两个数据库的数据。 这些数据库必须具有相同的代码页。 如果数据库中的任何表或行发生冲突,则 MsiDatabaseMerge 失败。 如果第一个数据库中的任何行中的数据与第二个数据库的相应行中的数据不同,则存在冲突。 相应的行位于两个数据库的同一表中,并且两个数据库中具有相同的主键。 非冲突数据库的表必须具有相同的主键数、相同的列数、相同的列类型、相同的列名,以及具有相同主键的行中的相同数据。 但是,临时列在列计数中无关紧要,并且相应的表可以具有不同的临时列数,只要持久列匹配,就不会产生冲突。

如果相应表中的列数、类型或名称不同,则两个数据库的架构不兼容,并且安装程序停止处理表,合并失败。 安装程序在检查行合并冲突之前检查两个数据库是否具有相同的架构。 如果返回ERROR_DATATYPE_MISMATCH,可以保证数据库未更改。

如果特定行中的数据不同,则这是行合并冲突,安装程序将返回ERROR_FUNCTION_FAILED并创建名为 szTableName的新表 。 此表的第一列是具有冲突的表的名称。 第二列提供具有冲突的表中的行数。 报告冲突的表如下所示。

类型 钥匙
桌子 文本 Y N
NumRowMergeConflicts 整数   N
 

无法从自定义操作调用此函数。 从自定义操作调用此函数会导致函数失败。

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

注意

msiquery.h 标头将 MsiDatabaseMerge 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 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
目标平台 窗户
标头 msiquery.h
Msi.lib
DLL Msi.dll

另请参阅

列定义格式

数据库管理功能