msiDatabaseMergeA 函式 (msiquery.h)
MsiDatabaseMerge 函式會將兩個資料庫合併在一起,以允許重複的數據列。
語法
UINT MsiDatabaseMergeA(
[in] MSIHANDLE hDatabase,
[in] MSIHANDLE hDatabaseMerge,
[in] LPCSTR szTableName
);
參數
[in] hDatabase
從 MsiOpenDatabase 取得之資料庫的句柄。
[in] hDatabaseMerge
從 MsiOpenDatabase 取得之資料庫的句柄,以合併到基底資料庫。
[in] szTableName
要接收合併衝突信息的數據表名稱。
傳回值
MsiDatabaseMerge 函式會傳回下列其中一個值:
傳回碼 | Description |
---|---|
|
已報告數據列合併衝突。 |
|
已提供無效或非作用中的句柄。 |
|
提供無效的數據表。 |
|
此函數已成功。 |
|
兩個資料庫之間的架構差異。 |
備註
MsiDatabaseMerge 函式和 Database 物件的 Merge 方法無法用來合併安裝套件中包含的模組。 它們不應該用來將 合併模組 合併至 Windows Installer 套件。 若要在安裝套件中包含合併模組,安裝套件的作者應遵循 套用合併模組 主題中所述的指導方針。
MsiDatabaseMerge 不會將內嵌 的封包檔案 或 內嵌轉換 從參考資料庫複製到目標資料庫。 二進位數據表或圖示數據表中列出的內嵌數據流會從參考資料庫複製到目標資料庫。 內嵌在參考資料庫中的記憶體不會複製到目標資料庫。
MsiDatabaseMerge 函式會合併兩個資料庫的數據。 這些資料庫必須具有相同的代碼頁。 如果資料庫中的任何數據表或數據列發生衝突,MsiDatabaseMerge 就會失敗。 如果第一個資料庫中任何數據列中的數據與第二個資料庫的對應數據列中的數據不同,就會發生衝突。 對應的數據列位於這兩個資料庫的相同數據表中,而且兩個資料庫中都有相同的主鍵。 非衝突資料庫的數據表必須具有相同的主鍵數目、相同數據行數目、相同數據行類型、相同數據行名稱,以及具有相同主鍵之數據列中的相同數據。 不過,暫存數據行在數據行計數和對應數據表中並不重要,只要持續性數據行相符,就可以有不同的暫存數據行數目,而不會產生衝突。
如果對應數據表中的數據行數目、類型或名稱不同,則兩個資料庫的架構不相容,而且安裝程式會停止處理數據表,而合併會失敗。 安裝程式會先檢查兩個資料庫是否具有相同的架構,再檢查數據列合併衝突。 如果傳回ERROR_DATATYPE_MISMATCH,則保證資料庫尚未變更。
如果特定數據列的數據不同,這是數據列合併衝突,安裝程式會傳回ERROR_FUNCTION_FAILED並建立名為 szTableName 的新數據表。 此資料表的第一個數據行是發生衝突之數據表的名稱。 第二個數據行會提供數據表中發生衝突的數據列數目。 報告衝突的數據表如下所示。
資料行 | 類型 | 答案 | Nullable |
---|---|---|---|
資料表 | Text | 是 | 否 |
NumRowMergeConflicts | 整數 | 否 |
無法從自定義動作呼叫此函式。 從自定義動作呼叫此函式會導致函式失敗。
如果函式失敗,您可以使用 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 |
程式庫 | Msi.lib |
Dll | Msi.dll |