c# - 从 C# 插入到 msi 数据库

标签 c# windows-installer

我正在尝试将一个新属性插入到 msi 文件中。我可以使用以下代码更新 msi 数据库文件。有没有办法将新值添加到表中。我找不到任何东西。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsInstaller;

namespace msiExample
{
[System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("000C1090-0000-0000-C000-000000000046")]
class Installer { }
class msiMain
{
    static void Main(string[] args)
    {
     WindowsInstaller.Installer ins = (WindowsInstaller.Installer)new Installer();

            string strFileMsi = @"C:\APP.msi";

           System.Console.WriteLine("STARTING SECOND QUERY");
            Database db2 = ins.OpenDatabase(strFileMsi, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeDirect);
            View vw2 = db2.OpenView(@"Select * FROM Property where Value='Unknown'");  

            vw2.Execute(null);

            Record rcrd2 = vw2.Fetch();
            while (rcrd2 != null)
            {
                System.Console.WriteLine(rcrd2.get_StringData(1));
                rcrd2.set_StringData(1,"No data");
                vw2.Modify(WindowsInstaller.MsiViewModify.msiViewModifyUpdate, rcrd2);

                rcrd2 = vw2.Fetch();

            }               
            db2.Commit();
            vw2.Close();
            System.Console.WriteLine("completed");   
    }
  }
}

最佳答案

Windows Installer XML (WiX) Deployment Tools Foundation (DTF) 库在这方面有很大帮助。我知道最简单的方法是:

using Microsoft.Deployment.WindowsInstaller.Linq;
using (QDatabase database = new QDatabase(@"C:\data\test.msi", DatabaseOpenMode.Direct))
{
  var record = database.Properties.NewRecord();
  record.Property = "MyProperty";
  record.Value = "MyValue";
  record.Insert();
}

如果您仍然想考虑 SQL,那么:

using Microsoft.Deployment.WindowsInstaller;
using (Database database = new Database(@"C:\data\test.msi", DatabaseOpenMode.Direct))
{
  database.Execute("INSERT INTO `Property` (`Property`, `Value`) VALUES('MyProperty', 'MyValue')");
}

关于c# - 从 C# 插入到 msi 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715950/

相关文章:

c# - 如何在 WPF 数据网格中添加页脚行?

c# - 如何阻止用户在不禁用列表框中选择项目

installation - 如何使用 Inno Setup 安装程序升级 MSI 安装?

installation - 为什么在 VDPROJ 上使用 Windows Installer XML (WiX)?

C# 如何计算我的 AppDomain 中的托管线程?

c# - .NET 的多线程库

c# - WPF:通过应用程序应用样式

installation - HOWTO 和最佳工作安装 (MSI) 链接器 +/ Bootstrap

c# - 从 C# 中的 msi 文件中获取产品名称

.net - 是否可以安装或运行 dotnetredist.exe(或任何任意 EXE)作为 .MSI 的一部分?