2011-04-12 34 views
0

我有一個文本框,我保存到使用ASP.NET C#中的SQL數據庫中保存文本時繞過'(報價)的問題。如何使用SQL

問題就像他和它的使用引號,例如文字。當你保存它時,我得到一個SQL錯誤。

從以往的經驗來解決這個問題,我要用就用替換命令查找報價的所有出現,並用其他字符替換它們。然後,如果我要讀取數據庫和之前保存的文本,我會再次替換。

有沒有更好的做這件事?或者你仍然需要使用這種「舊」的方式。

+1

你找到一個網站/例子顯示像'「SELECT * FROM x,其中Y ='」 +東西+「'」'?我們應該集體追捕他們.. – 2011-04-12 14:49:26

+0

請注意民間對參數化查詢的看法:SQL注入是一個嚴重的問題。 – gbn 2011-04-12 14:58:18

回答

6

使用參數化查詢。

使用替代是危險的,可能會導致無意SQL注入漏洞。

+0

嚴重的是,使用參數。這比試圖處理每個角落案例要容易得多。 – 2011-04-12 14:44:29

+0

注射風險真的是問題 - 使用參數 – Randy 2011-04-12 14:55:34

+0

感謝您的提示;長時間沒有編程,這一切都是一點一點回到我身上。 ;) – TeaDrinkingGeek 2011-04-12 15:04:54

3

始終使用參數化查詢。切勿將字符串連接在一起(具有未清理的輸入信息)以便即時創建SQL。您可能會面臨SQL注入攻擊的風險。

請仔細閱讀以下指南:

http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx

而且當你理解了以下四格漫畫,你準備代碼:

http://xkcd.com/327/

+1

這個。另外,請參閱http://bobby-tables.com/ – 2011-04-12 14:43:38

0

至於其他的答案指出, 正確這裏的答案是使用參數化查詢

但是,這有時是不可能的。在這種情況下,你最好加引號:

String str = "he's"; 
str = str.Replace("'", "''"); 
+0

謹慎評論downvote? – Jaymz 2011-04-12 14:48:05

+0

注意:在SQL中轉義字符串的正確方法因數據庫系統而異。我知道上述方法適用於SQL Server和MS Access。對於任何其他數據庫,它可能是不同的,並且不應該在未驗證特定數據庫的情況下使用上述方法。它應該例如*不*用於MySQL。 (不是我downvote,順便說一句) – Guffa 2011-04-12 14:49:57

+0

我不認爲這是足夠的無風險注射。還有其他字符可以用來分解命令(例如,退格字符)。 (不是我downvote要麼) – 2011-04-12 14:50:37

0

有兩種方法來解決這個問題:

  1. 使用參數化查詢,例如在http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx - 這也將有助於避免基本的SQL注入,如果你擔心的話
  2. 創建2個新函數,一個將每個撇號加倍,以便它正確保存到數據庫中,另一個在檢索時刪除額外的撇號來自數據庫的數據。

我會推薦第一種方法,因爲在我看來它更清潔(更安全)。如果您使用C#爲ASP.NET,你可以做這樣的事情在我下面的例子:

string clientName = "Test client"; 
SqlCommand sqlCommand = new SqlCommand("SELECT COUNT(*) FROM Client WHERE UPPER(ClientName) = UPPER(@ClientName)", connection); 
sqlCommand.Parameters.AddWithValue("@ClientName", clientName);