2015-08-12 8 views
5

Cosa c'è di sbagliato nella prossima query WMi? (Ho ottenuto l'eccezione di gestione "query non valida").Eccezione "query non valida" senza motivo chiaro

 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

hai una connessione DB? prova a eseguire la query semplicemente (senza LIKE) o persino a codificare il parametro LIKE solo per il test –

+0

@NikosM. query syntasys è valida .. puoi provare o nyour env. con lavori come hardcoded –

+1

La query non funziona perché la proprietà 'Antecedent' è un riferimento a un oggetto CIM e l'operatore' LIKE' può essere utilizzato solo nelle proprietà di tipo 'stringa'. – RRUZ

risposta

0

id suggerisco di utilizzare stringa pura invece di formattazione: questo:

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

invece di questo:

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

E ancora una cosa: Perché è necessario utilizzare const sulla stringa? Forse potrebbe essere anche il tuo problema.

+3

Se usa 'String.Format' o no non cambierà nulla .. e' String.Format' generalmente sembra più ordinato .. – Rob

+0

Non riesco a eseguire il debug del suo codice quindi è stata solo un'idea mia. –

1

io non riuscivo a capire come risolvere l'errore originale, ma il seguente approccio può essere utilizzato come una soluzione:

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

Ho notato altre persone che hanno lo stesso problema e alcune persone suggerito di usare ASSOCIATORS OF Istruzione (Risorsa: https://superuser.com/questions/740564/wmi-query-based-on-antecedent-string) Questa è la risposta accettata qui, quindi potrebbe funzionare anche per te.

+0

lo stesso trucco che sto usando ora, ma ancora pericoloso perché non funziona .. questo fa perdere tempo –

Problemi correlati