2015-08-12 24 views
5

Bir sonraki WMi sorgusunda sorun nedir? ("Geçersiz sorgu" yönetim istisnası var).Net bir neden olmadan "Geçersiz sorgu" istisnası

 const string deviceName = "04157DF42C9B1109"; 

     string wmiQuery = string.Format("SELECT * FROM Win32_USBControllerDevice WHERE Antecedent LIKE '%{0}%'", deviceName); 

     ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery); 
     ManagementObjectCollection retObjectCollection = searcher.Get(); 

     foreach (ManagementObject retObject in retObjectCollection) 
     { 
      Console.WriteLine("[{0}]:{1}", retObject["Antecedent"], retObject["Dependent"]); 
     } 
+0

DB bağlantınız var mı? Sorguyu sadece (LIKE olmadan) çalıştırmayı deneyin veya sadece –

+0

@ NikosM'yi test etmek için LIKE parametresini de kodlayın. sorgu sözdizimi geçerlidir .. sen eny deneyebilirsiniz. gibi kodlanmış çalışır –

+1

Sorgu çalışmıyor, çünkü "Antecentent" özelliği bir CIM nesnesine bir Referanstır ve 'LIKE' operatörü yalnızca 'string' tipi özelliklerinde kullanılabilir. – RRUZ

cevap

0

kimliği yerine onu biçimlendirme saf dizesini kullanmanızı öneririz: Bu: bunun yerine

string wmiQuery = "select * from Win32_USBControllerDevice where Antecedent like '%" + deviceName + "%'"; 

:

string wmiQuery = string.Format("SELECT * FROM Win32_USBControllerDevice WHERE Antecedent LIKE '%{0}%'", deviceName); 

Ve bir şey daha: Neden kullanmak gerekiyor dizede const? Belki de senin sorunun da olabilir.

+3

"String.Format" işlevini kullanıyor ya da kullanmıyor, bir şey değiştirmeyecek .. ve 'String.Format 'genellikle de düzgün görünüyor .. – Rob

+0

Onun kodunu ayıklayamıyorum, bu yüzden benden bir fikir geldi. –

1

orijinal hatayı düzeltmek için nasıl çözemedim ama şu yaklaşım geçici bir çözüm olarak kullanılabilir: Ben aynı sorunu olan diğer insanların fark

string wmiQuery = string.Format("SELECT * FROM Win32_USBControllerDevice"); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery); 
ManagementObjectCollection retObjectCollection = searcher.Get(); 

var retObjectList = retObjectCollection.Cast<ManagementObject>() 
    .Where(m => ((string)m["Antecedent"]).Contains(deviceName)) 
    .ToList(); 

foreach (ManagementObject retObject in retObjectList) 
{ 
    Console.WriteLine("[{0}]:{1}", retObject["Antecedent"], retObject["Dependent"]); 
} 

ve bazı insanlar OF Associators kullanarak önerdi statement (Kaynak: https://superuser.com/questions/740564/wmi-query-based-on-antecedent-string) Burada kabul edilen cevap bu yüzden sizin için de işe yarayabilir.

+0

aynı geçici çözüm Şimdi kullanıyorum, ama hala işe yaramaktan hoşlanıyorum .. bu zaman harcıyor –

İlgili konular