2015-08-12 9 views
5

Co jest nie tak z następną kwerendą WMi? (Mam wyjątek zarządzania "Nieprawidłowe zapytanie").Wyjątek "Nieprawidłowe zapytanie" bez wyraźnego powodu

 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

czy masz połączenie DB? spróbuj uruchomić kwerendę po prostu (bez LIKE) lub nawet zakodować parametr LIKE tylko do testowania –

+0

@NikosM. zapytanie syntasys jest poprawne. Możesz spróbować o nyour env. z zakodowanymi na sztywno pracami –

+1

Zapytanie nie działa, ponieważ właściwość 'Antecedent' jest odniesieniem do obiektu CIM, a operator' LIKE' może być używany tylko we właściwościach typu "string'. – RRUZ

Odpowiedz

0

id Proponuję użyć czystego ciąg zamiast formatowania go: to:

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

zamiast tego:

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

i jeszcze jedno: Dlaczego trzeba użyć const na ciągu? Może to też może być twój problem.

+3

Niezależnie od tego, czy użyje 'String.Format', czy też nie, niczego nie zmieni, a' String.Format' generalnie wygląda lepiej. – Rob

+0

Nie mogę debugować jego kodu, więc to był tylko pomysł ode mnie. –

1

Nie mogłem dowiedzieć się, jak naprawić błąd oryginalny ale Poniższa metoda może być stosowana jako obejście:

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"]); 
} 

zauważyłem innych ludzi mających ten sam problem i niektórzy ludzie sugerują, używając ASSOCIATORS TOWARÓW Oświadczenie (Zasób: https://superuser.com/questions/740564/wmi-query-based-on-antecedent-string) To akceptowana tutaj odpowiedź, więc może po prostu działać również dla Ciebie.

+0

samo obejście używam teraz, ale nadal qurous, dlaczego jak nie działa ... to marnuje czas –

Powiązane problemy