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
两个数据库之间的架构差异。

注解

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

MsiDatabaseMerge 不会将嵌入 的 Cabinet 文件嵌入式转换 从引用数据库复制到目标数据库。 Binary 表Icon 表中列出的嵌入数据流将从引用数据库复制到目标数据库。 引用数据库中嵌入的存储不会复制到目标数据库。

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

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

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

类型 密钥 Nullable
文本 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
目标平台 Windows
标头 msiquery.h
Library Msi.lib
DLL Msi.dll

另请参阅

列定义格式

数据库管理函数