2011-10-12 262 views
7

我有一個字符串如何用雙撇號替換撇號?

good overview of ESP's in more detail than you probably need

在插入到SQL表時,它給出了錯誤。所以我想用雙撇撇號替換字符串中像

good overview of ESP''s in more detail than you probably need

如何處理這在C#?

+1

您應該使用數據庫轉義函數。如果你不這樣做,你可能會讓自己容易受到SQL注入的攻擊。 http://stackoverflow.com/questions/249567/algorithm-to-avoid-sql-injection-on-mssql-server-from-c-code – CheeseSucker

+0

或者,甚至更好:參數化查詢。 – MatBailie

回答

10

非常簡單:

string s = "good overview of ESP's in more detail than you probably need."; 
string escaped = s.Replace("'","''"); 

注:它通常是使用更安全的命令參數。特別是如果輸入字符串的值不受您的代碼(即用戶條目)控制。

+3

雖然這在技術上是正確的,但它卻在錯誤的方向上引導原始提問者。更好地使用正確的參數並避免SQL注入漏洞。 –

+0

如果字符串被轉義,注入仍然會發生嗎?據我所知,注入是通過使用一個單一的背教者過早終止sql。 –

8

使用參數對象。

myCommand.InsertCommand.Parameters.Add("@myString", SqlDbType.VarChar, 200); 
    myCommand.InsertCommand.Parameters["@myString"].Value = @"good overview of ESP's in more detail than you probably need."; 
0

String.Replace(String,String)應該可以正常工作。在這個例子中,你想要:

String.Replace("'", "''") 

但是,我不認爲這將解決您的問題。我想你更恰當地尋找:

String.Replace("'", "\'") 

這樣做的原因在於MySQL和我想像SQL的其他版本,預計在單引號括起來的字符串。

+0

我同意這直接回答這個問題,但它幫助OP做了一個壞習慣。如果使用參數化查詢,這個問題就會消失,並且他們採取一種防止注入攻擊的做法,協助執行計劃緩存等等。 – MatBailie

+0

@dambrisco:一些SQL方言使用雙撇號('')而不是逃逸你爲MySQL提出的序列(\')。 –

+0

@Dems - 我完全同意,但是,考慮到這個問題,我認爲採取嬰兒步驟可能會更好。向不瞭解轉義序列的人解釋參數化可能是一個糟糕的開始。無論如何,使用Daok的解決方案要比我的解決方案好得多。 –

2

我一直在處理這個問題的年齡。在客戶端執行,用兩個單引號替換單引號。如果使用多個varchar輸入參數執行sp,這將起作用。唯一的問題是SQL注入,即人們可以看到你在客戶端上做什麼,這永遠不是好事。如前所述,唯一的方法就是在服務器上使用SQLparameters。

0

myCommand.InsertCommand.Parameters.Add(「@ myString」,SqlDbType.VarChar,200); myCommand.InsertCommand.Parameters [「@ myString」]。值