在SQL

时间:2016-01-29 05:19:03

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

我正在尝试在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>

2 个答案:

答案 0 :(得分:3)

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

  • 不支持DESCLIKE,而ORDER BY可能无法按预期处理字符串
  • 更新查询无法修改主键列中的值
  • 无法在SQL查询中转义撇号字符&#39; 。如果您需要匹配'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( );