我正在尝试在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异常。< / p>
答案 0 :(得分:3)
Windows Installer实现SQL Syntax中描述的SQL子集。在该子集中有几个限制,包括我在此强调的三个限制:
DESC
或LIKE
,而ORDER BY
可能无法按预期处理字符串'It's'
之类的字符串值,则必须在查询中使用问号?占位符,并将包含该值的记录传递给view.Execute(record)
答案 1 :(得分:0)
要克服安装程序支持的SQL的有限功能,您可以使用wix附带的Microsoft.Deployment.WindowsInstaller.Linq
程序集。例如,要提取InstalExecuteSequece表的最后一个序列号,您只需编写以下查询:
var db = session.Database.AsQueryable( );
var lastSequence = db.ExecuteIntegerQuery( "SELECT `Sequence` FROM `InstalExecuteSequece` ORDER BY `Sequence`" ).Last( );