sql 中的 WindowsInstaller msi 数据库查询是否有任何限制

Is there any restriction to WindowsInstaller msi database queries in sql

我正在尝试 运行 在 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 关键字和所有,它有效 fine.Similarly LIKE KEYWORD also.All 其中给出 sql 异常。

Windows 安装程序实现 SQL Syntax 中描述的 SQL 的子集。在该子集中有几个限制,包括我将在此处强调的三个限制:

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

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

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