2015-08-12 22 views
5

Điều gì sai với truy vấn WMi tiếp theo? (Tôi đã nhận được "truy vấn không hợp lệ" ngoại lệ quản lý).Ngoại lệ "Truy vấn không hợp lệ" không có lý do rõ ràng

 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

bạn có kết nối DB không? thử chạy truy vấn đơn giản (không có LIKE) hoặc thậm chí mã hóa tham số LIKE chỉ để thử nghiệm –

+0

@NikosM. truy vấn cú pháp là hợp lệ .. bạn có thể thử o nyour env. với hardcoded giống như tác phẩm –

+1

Truy vấn không hoạt động vì thuộc tính 'Antecedent' là một tham chiếu đến đối tượng CIM, và toán tử' LIKE 'chỉ có thể được sử dụng trong thuộc tính kiểu' string'. – RRUZ

Trả lời

0

id đề nghị bạn sử dụng chuỗi tinh khiết thay vì định dạng nó: này:

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

thay vì điều này:

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

Và một điều nữa: Tại sao bạn cần phải sử dụng const trên chuỗi? Có lẽ đó cũng có thể là vấn đề của bạn.

+3

Cho dù anh ta sử dụng 'String.Format' hoặc không sẽ không thay đổi bất cứ điều gì .. và' String.Format' thường trông neater .. – Rob

+0

Tôi không thể gỡ lỗi mã của mình vì vậy nó chỉ là một ý tưởng từ tôi. –

1

tôi không thể tìm ra cách để sửa chữa các lỗi ban đầu nhưng cách tiếp cận sau đây có thể được sử dụng như một cách giải quyết:

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

tôi nhận thấy những người khác có cùng một vấn đề và một số người đề nghị sử dụng ASSOCIATORS HÀNH tuyên bố (Tài nguyên: https://superuser.com/questions/740564/wmi-query-based-on-antecedent-string) Đó là câu trả lời được chấp nhận ở đây vì vậy nó có thể chỉ làm việc cho bạn quá.

+0

cùng một cách giải quyết Tôi đang sử dụng ngay bây giờ, nhưng vẫn còn rất nhiều lý do tại sao như không làm việc .. điều này lãng phí thời gian –

Các vấn đề liên quan