2013-04-16 130 views
1

我正在嘗試使用Wix DTF自定義操作將MSI運行時會話值寫入註冊表。 這是我想通過添加臨時記錄到數據庫中的「註冊表」表。 由於C++有一個WcaAddTempRecord方法來實現這一點,真的想知道DTF中是否有任何等價的方法。Wix DTF自定義操作等效WcaAddTempRecord

注意:我嘗試使用Session.Database.OpenView插入記錄,但始終由於會話數據庫只讀屬性而出現更新失敗錯誤。

有人可以建議這種情況的最佳方法?

回答

0

MSI數據庫在安裝過程中是隻讀的。所以你不能添加永久行。但是,您可以插入臨時行。一旦從Session.Database.OpenView()得到View,然後使用View對象上的InsertTemporary()方法添加臨時行。

這就是WcaAddTempRecord()以其名稱獲得Temp的方式。 :)

0

這是我 「去」 的輔助方法:

private static void InsertTempRecord(Session session, string tableName, Object[] objects) 
{ 
    Database db = session.Database; 
    string sqlInsertSring = db.Tables[tableName].SqlInsertString + " TEMPORARY"; 
    session.Log("SqlInsertString is {0}", sqlInsertSring); 
    View view = db.OpenView(sqlInsertSring); 
    view.Execute(new Record(objects)); 
    view.Close(); 
} 

欲瞭解更多信息,請參閱:

Dynamic Windows Installer UI

+0

感謝羅布和克里斯。 – user2286870

+0

我試過使用上面的方法,但我得到表更新失敗錯誤。當我添加InsertTemporary之前視圖執行如下View view = db.OpenView(sqlInsertSring); view.InsertTemporary(new Record(6)); view.Execute(new Record(objects));我得到數據庫:。遊標處於無效狀態,無法繼續。 – user2286870

+0

表格是否存在? WiX在構建MSI時傾向於剔除未使用的表。您可以使用EnsureTable元素來指示它不要這樣做。你確定你傳遞了正確的數量和類型的對象嗎?我已經在很多安裝中使用了這種方法,並且毫無疑問我認爲它可以工作。 –