【问题标题】:Is there any restriction to WindowsInstaller msi database queries in sqlsql中的WindowsInstaller msi数据库查询是否有任何限制
【发布时间】:2016-05-06 18:26:29
【问题描述】:

我正在尝试在 c# 中对我的 msi 数据库运行一些 sql 查询。但似乎某些特定的 sql 查询不起作用。

WindowsInstaller.Installer ins = (WindowsInstaller.Installer)new Installer();
string strFileMsi = @"abc.msi";
Database db3 = ins.OpenDatabase(strFileMsi, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeDirect);

string q = "SELECT File FROM File WHERE FileName LIKE '%s%'";
WindowsInstaller.View vw = db3.OpenView(q);
vw.Execute(null);
string q2="SELECT * FROM InstalExecuteSequece ORDER BY Sequence DESC"

WindowsInstaller.View vw2 = db.OpenView(q2);
vw.Execute(null);

如果我在没有 DESC 关键字的情况下运行相同的查询,它可以正常工作。LIKE KEYWORD 也是如此。所有这些都会给出 sql 异常。

【问题讨论】:

  • 尝试单独运行查询?除了集成在微星中
  • 是的。简单的 crud 操作有效,但像这样的一些关键字不起作用。
  • 我认为不会有任何限制..

标签: c# mysql sql-server windows-installer


【解决方案1】:

Windows Installer 实现了SQL Syntax 中描述的 SQL 子集。在该子集中有几个限制,包括我将在这里强调的三个:

  • 不支持DESCLIKEORDER BY 可能无法按预期处理字符串
  • 更新查询不能修改主键列中的值
  • 无法在 SQL 查询中转义撇号字符 '。如果需要匹配'It's' 之类的字符串值,则必须在查询中使用问号? 占位符,并将包含该值的记录传递给view.Execute(record)

【讨论】:

    【解决方案2】:

    要克服安装程序支持的 SQL 的有限功能,您可以使用 wix 附带的 Microsoft.Deployment.WindowsInstaller.Linq 程序集。例如,要提取 InstalExecuteSequece 表的最后一个序列号,您只需编写以下查询:

    var db = session.Database.AsQueryable( );
    var lastSequence = db.ExecuteIntegerQuery( "SELECT `Sequence` FROM `InstalExecuteSequece` ORDER BY `Sequence`" ).Last( );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多