2015-05-29 155 views
4

我正在嘗試使用預處理語句使用LIKE子句發出SQL請求。Like子句和準備語句

下面是代碼:

using (SqlConnection Connection = new SqlConnection(ConnectionString)) 
     { 
     Connection.Open(); 
     string Query = "SELECT TOP 10 Field FROM Table WHERE Field LIKE '@pseudopart%'"; 
       using (SqlCommand Command = new SqlCommand(Query, Connection)) 
       { 
        Command.Parameters.AddWithValue("@pseudopart", pseudoPart); 
        using (SqlDataReader Reader = Command.ExecuteReader()) 
        { 
         if (!Reader.HasRows) 
          return PossibleMatch; 
         while (Reader.Read()) 
         { 
          PossibleMatch.Add(Reader["Field"].ToString()); 
         } 
        } 
       } 
      } 

讀者永遠是空的,什麼是我做錯了什麼?

+0

這裏的答案:http://stackoverflow.com/questions/303149 /參數化查詢與 - 樣和 - 在條件。問題是重複的。 –

+0

@DmitryEgorov同意。正確的答案在於相關的問題。 – RBarryYoung

+0

由於SonerGönül的回答如下所示,當您使用這樣的參數時,它會自動嘗試併爲您添加單引號。所以當你手動輸入時,它不會像你想象的那樣鍛鍊。 – CathalMF

回答

5

由於您使用單引號,它會將您的@pseudopart%零件視爲string literal而非參數。

這就是爲什麼你要用@pseudopart%字符串篩選Field列,而不是pseudoPart變量的值。這就是爲什麼你的讀者是空的。

反而使用它;

string Query = "SELECT TOP 10 Field FROM Table WHERE Field LIKE @pseudopart"; 
.. 
Command.Parameters.AddWithValue("@pseudopart", pseudoPart + "%"); 

順便說一下,不要使用AddWithValue方法。 It may generate unexpected results sometimes。使用Add() method overloads來指定您的參數SqlDbType及其大小。

我必須說,TABLE是在T-SQL一個reserved keyword。您應該將它與方括號[TABLE]一起使用。有些數據庫管理員不會考慮關鍵字情況(表 - 表),但據我所知,SQL Server確實將其視爲默認情況。

最好的辦法是將其更改爲 - 保留字。

+0

偉大的思想似乎覺得一樣! – Pseudonym

+0

工作正常,謝謝,並感謝您的提示! –

0

你應該在你的參數中添加%和ado.net提供商將會爲您解決您的SQL查詢,樣品:

string Query = "SELECT TOP 10 Field FROM Table WHERE Field LIKE @pseudopart"; 
using (SqlCommand Command = new SqlCommand(Query, Connection)) 
{ 
    Command.Parameters.AddWithValue("@pseudopart", string.Concat(pseudoPart, "%"));