我試圖更新MSI中的媒體表,將#
附加到Cabinet字段中任何內容的開頭。更新MSI文件中的表
我已經跑:
Cscript WiRunSQL.vbs %CopiedFile% "UPDATE `Media` SET `Media`.`Cabinet`='%CabUpdate%' WHERE `Media`.`DiskId`=1"
但是,拋出了微星API錯誤80004005:的openDatabase,DatabasePath,用於openmode
然後,我創建了一個測試C#應用程序,它取代無論是在內閣場與值。但它只是將Cabinet字段更新爲空字符串。
var db = new Database(@"C:\Users\Me\test.msi", DatabaseOpenMode.Direct);
var query = db.ExecuteQuery("Select Cabinet from Media"); // gets: blah.cab
string oldCab = query[0].ToString(); // this is 'blah.cab'
string newCab = "#" + oldCab; //this is then '#blah.cab'
string updateString = "UPDATE `Media` SET `Media`.`Cabinet` = '" + newCab + "'
WHERE DiskId = 1";
try
{
db.Execute(updateString);
}
catch(Exception ex)
{
}
有什麼明顯的我失蹤了嗎?還是有另一種方式來實現這一點(不使用Orca,必須從批處理文件中運行)。
不幸的executeQuery的內部細節我也不清楚,要看你使用的互操作庫。然而,基本的C++直接調用將需要您使用更新查詢來執行OpenView,然後執行View Execute,所以也許這就是您錯過的。另外,關於newcab的引用對我來說並不合適。您使用的字符串只能用單引號將cab名稱 - 在原始更新文本中您希望它爲'#blah.cab'。 – PhilDW
他正在使用C#與Microsoft.Deployment.WindowsInstaller(WiX DTF) –