2012-05-03 9 views
0

我面臨問題:在向MsiAssembly和MsiAssemblyName添加條目時使用MsiOpenDatabaseView()方法的msi數據庫表錯誤代碼爲1615時正好失敗。只有這兩個表是這種情況。起初,我認爲這應該是由於我改變應用程序類型爲.NET的原因。但改變後也不能正常工作。然後,我嘗試更新_Validation表的MsiAssembly和MsiAssemblyName表的條目。它太努力了。可能我錯過了一些依賴,它阻礙了在MsiAssembly和MsiAssembly表中輸入的記錄。你能給我一些線索或暗示這個問題嗎?謝謝。error:1615 msi數據庫中輸入記錄到MsiAssembly和MsiAssemblyName表中

回答

0

錯誤1615是「SQL查詢語法無效或不支持」。在沒有看到您的查詢的情況下,我的第一個猜測是該表不存在於您嘗試編輯的.msi文件中,或者您正在嘗試執行Windows Installer SQL語法未正確支持的操作。 (對於複雜的查詢,我喜歡通過MsiVewModify()使用基於記錄的更新儘可能。)

用於插入你的錯誤信息,您可以驗證表中存在通過驗證

MsiDatabaseIsTablePersistent(hDatabase, TEXT("MsiAssembly")) == MSICONDITION_TRUE 

如果沒有,你可以通過調用MsiDatabaseImport(將其傳遞給從MsiDatabaseExport創建的文件)或通過正確的CREATE TABLE ... SQL查詢添加它。

然後,我寧願沿着下面的行插入代碼(爲了清晰起見,省略了錯誤檢查)。它可以在一路上的幾個步驟中提供錯誤信息,而不是集中到原始SQL方法的MsiViewExecute調用中。

PMSIHANDLE hView, hRec; 
MsiDatabaseOpenView(hDatabase, TEXT("SELECT * FROM `MsiAssembly`"), &hView); 
MsiViewExecute(hView, NULL); 
hRec = MsiCreateRecord(5); 
MsiRecordSetString(hRec, 1, TEXT("Abc.dll")); 
MsiRecordSetString(hRec, 2, TEXT("MainApp")); 
MsiRecordSetString(hRec, 3, TEXT("Abc")); 
MsiRecordSetString(hRec, 4, TEXT("")); 
MsiRecordSetInteger(hRec, 5, 0); 
// note: if modifying during installation, use MSIMODIFY_INSERT_TEMPORARY instead 
MsiViewModify(hView, MSIMODIFY_INSERT, hRec); 
+0

調用MsiGetLastErrorRecord對於額外的細節,將所得手柄傳遞到MsiFormatRecord結果如下:1:2228 2:F:\源\ Mymsi.msi 3:MsiAssembly 4:INSERT INTO'MsiAssembly' ('MsiAssembly'.'Component_','MsiAssembly'.'Feature_', 'MsiAssembly'.'File_Manifest', 'MsiAssembly'.'File_Application', 'MsiAssembly'.'Attributes') VALUES(「ABC。 dll','MainApp','Abc','',0)2228:代表未知表格,但表格存在於msi DB中。 – dev

+0

我有這個錯誤的原因。在msi數據庫中,如果某些表未初始化(空),並且我們嘗試在其中插入記錄,則會收到錯誤消息:2228 - 表未知或不存在。但如果以某種方式(通過使用windows installer,wix等),我們在表中放置了一個虛擬記錄。這個問題將得到解決。我不知道這個原因。但大部分時間都是這種情況。如果有人解釋這一點,這將是非常有幫助的。 – dev

+0

聽起來像你確認了我的預感 - 桌面並不存在於你的內置MSI中。 (也許明智地刪除空表。) –

相關問題