2014-12-22 24 views
0

我試圖更新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,必須從批處理文件中運行)。

+0

不幸的executeQuery的內部細節我也不清楚,要看你使用的互操作庫。然而,基本的C++直接調用將需要您使用更新查詢來執行OpenView,然後執行View Execute,所以也許這就是您錯過的。另外,關於newcab的引用對我來說並不合適。您使用的字符串只能用單引號將cab名稱 - 在原始更新文本中您希望它爲'#blah.cab'。 – PhilDW

+1

他正在使用C#與Microsoft.Deployment.WindowsInstaller(WiX DTF) –

回答

0

添加#僅僅表示使用嵌入式媒體。我假設你正在壓縮出租車並將它們放入_Streams中,並處理所有File表序列ID。

如果只是更新你想要做一些類似的一個領域:

首先,查詢該表,並獲得媒體鍵和內閣名字典。然後,遍歷這個收集和:

using (View view = _database.OpenView("SELECT * FROM `Media` WHERE `Media`.`DiskId` = '{0}'", mediaKey)) 
      { 
       view.Execute(); 
       using (Record record = view.Fetch()) 
       { 
        record.SetString("Cabinet", "#" + cabinetName); 
        view.Update(record); 
       } 
      } 

我適應這個(但沒有編譯或測試)從類似的代碼我有其他表的代碼。我做了很多這項工作,通常還有很多涉及到最初看到的內容。

+0

感謝您的答覆,我嵌入cab等我只需要自動化數據庫中的更改(使用它Orca手動更改它會產生預期的結果)。 我已經實現了你的例子,但是我仍然收到了我原來有的同樣的錯誤,在這個錯誤中,它使用空字符串替換了cabinet中的值。 – Rookasaur

0

我知道它有點晚了,但如果能夠幫助:

 using (Database database = new Database(@"msi_path", DatabaseOpenMode.Transact)) 
      { 
       using (var view = database.OpenView(database.Tables["Media"].SqlSelectString)) 
       { 
        view.Execute(); 
        Record record = view.Fetch(); 
        while (record != null) 
        { 
         if (record.GetString(4) != "") // replace the empty string with ur value 
         { 
          record.SetString("Cabinet", "#" + record.GetString(4)); 
          view.Modify(ViewModifyMode.Assign, record); 
          database.Commit(); 
         } 
         record = view.Fetch(); 
        } 
}