2016-01-29 145 views
0

我想在我的msi数据库在c#中运行一些SQL查询。但它似乎有些特定的SQL查询不起作用。是否有任何限制WindowsInstaller msi数据库查询在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异常的情况。

+0

尝试单独运行查询?除了整合MSI – tharif

+0

是的。简单的crud操作可行,但一些像这样的关键字不起作用。 –

+0

我不认为会有任何限制.. – tharif

回答

3

Windows Installer实现了SQL Syntax中描述的SQL的子集。在这一集也有一些限制,其中包括三个,我将要在此强调:

  • 没有为DESCLIKE不支持,如您所愿
  • 更新查询无法修改值ORDER BY可能不是处理字符串在主键列中
  • 无法在SQL查询中转义撇号字符'。如果您需要匹配字符串值(如'It's'),则必须使用问号占位符的查询和传递包含值的记录,以view.Execute(record)
0

为了克服安装程序支持的SQL的能力有限,你可以利用它随威克斯的Microsoft.Deployment.WindowsInstaller.Linq组装。例如,要提取InstalExecuteSequece表的最后一个序列号,您只需编写以下查询:

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