【问题标题】:Wix DTF Custom Action Equivalent of WcaAddTempRecordWix DTF 自定义操作等效于 WcaAddTempRecord
【发布时间】:2013-04-17 19:27:47
【问题描述】:

我正在尝试使用 Wix DTF 自定义操作将 MSI 运行时会话值写入注册表。 我想通过将临时记录添加到数据库中的“注册表”表来实现。 由于 c++ 有一个WcaAddTempRecord 方法来实现这一点,所以很想知道 DTF 中是否有任何等效的方法。

注意:我尝试使用Session.Database.OpenView 插入记录,但由于会话数据库只读属性,我一直收到更新失败错误。

有人可以建议这种情况的最佳方法吗?

【问题讨论】:

    标签: wix dtf


    【解决方案1】:

    MSI 数据库在安装期间是只读的。所以你不能添加永久行。但是,您可以插入临时行。从Session.Database.OpenView() 中获取View 后,然后使用InsertTemporary() 对象上的InsertTemporary() 方法添加临时行。

    这就是WcaAddTempRecord() 在其名称中获取Temp 的方式。 :)

    【讨论】:

      【解决方案2】:

      这是我的“转到”辅助方法:

      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

      【讨论】:

      • 我尝试使用上述方法,但出现表更新失败错误。当我在视图执行之前添加 InsertTemporary 时,如下所示 View view = db.OpenView(sqlInsertSring); view.InsertTemporary(新记录(6)); view.Execute(新记录(对象));我得到数据库:。光标处于无效状态,无法继续。
      • 该表是否存在? WiX 在构建 MSI 时倾向于丢弃未使用的表。您可以使用 EnsureTable 元素来指示它不要这样做。你确定你传入了正确数量和类型的对象吗?我已经在多次安装中使用过这种方法,我认为它确实有效。
      • 更新了答案以引用我曾经写过的一篇博客文章。哇,真的是 5 年前吗?
      • 感谢大家的建议,重复主键是一个非常愚蠢的错误。像魅力一样工作
      • 是的,我确实接受了答案并完全承认这是一段完全可以工作的代码。感谢 Chris 和 Rob :)
      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多