2014-04-02 142 views
0

我試圖將參數傳遞給quert,但它不起作用。什麼是最好的方式來做到這一點?我不想連接字符串。這裏是我的查詢:使用LIKE的sql參數化查詢

string cmd = @" 
SELECT 
    * 
FROM 
    TABLE 
WHERE 
    p.PromptTypeID = pt.ID 
    AND p.PromptDomainID = pd.ID 
    AND p.LanguageID = pl.ID 
    AND p.VoiceID = pv.ID 
    AND p.Active='Y' 
    AND PromptText LIKE ?    
ORDER BY 
    p.ID DESC"; 

using (SqlCommand command = new SqlCommand()) 
      { 
       command.CommandText = cmd; 
       command.Transaction = transac; 
       command.Connection = cnn; 
       command.Parameters.Add("?", SqlDbType.VarChar, 50).Value = "%" + text + "%"; 
       using (SqlDataAdapter adp = new SqlDataAdapter(command)) 
       { 
        adp.Fill(dt);       
       } 
      } 

我無法通過LIKE運算符傳遞值。我也嘗試使用@text而不是「?」但它不起作用。有什麼建議麼?

順便說一句,它給''附近的語法不正確。 SQLEXCEPTION

+0

你正在收到什麼錯誤? –

+0

看起來你至少錯過了類似值的SQL中的文本撇號。應該適當成爲參數值的一部分。 –

+0

@GordonLinoff'?'附近語法不正確 – cihata87

回答

0

嘗試

AND PromptText LIKE @text 

command.Parameters.Add("@text"... 
1

更換?一些SQL變量和更改command.Parameters.Add像下面

PromptText LIKE %@Text% 

cmd.Parameters.Add("@Text", varYourtext); 
-3

你可以使用字符串連接。

cmd = cmd.Replace("?","'%" + text + "%'"); 
+0

這將完全否定參數的要點。見娜文的下面的答案(基本上與喬的相同,但相對於OP的問題更完整和優雅)。 –

+0

@Steve Pettifer,我同意你的意見。但這個解決方案的工作 –

+1

它有效,但它違反了OP的要求,完全是錯誤的做法。參數化查詢的一個主要觀點是減少SQL注入攻擊的可能性,但是通過規避你失去的參數。僅僅因爲它的工作原理並不能成爲有效的解決方案。 –

0

我終於找到了解決方案。當我使用「.... LIKE%@ text%」並傳遞參數command.Parameters.Add(new SqlParameter("@text", text));時,它會在'@text'異常附近給出錯誤的語法。

但是...

我用 「.... LIKE @Text」,並傳遞參數與command.Parameters.Add(new SqlParameter("@text", "%"+text+"%"));它的工作原理。