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

本文关键字:是否 任何限 查询 数据库 sql 中对 WindowsInstaller msi | 更新日期: 2023-09-27 18:32:26

我正在尝试在 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 关键字也是如此。所有这些都给出了 sql 异常。

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

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

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

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

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