2016-01-29 93 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();