2017-07-06 83 views
0

我正在做2012年Vb.net這個程序有SQL Server 2012的插入數據到包含撇號

一個這樣的數據庫表是Description的列的連接,並在SQL Server數據庫有些情況下日期可能包括撇號,例如...'電鋸15'3「X 1 1/2 X .050 X 3/4'

當我運行查詢時,數據之間的撇號會導致在查詢的語法錯誤,這是VB.net中的查詢行。

CMD.CommandText = 
"INSERT INTO Table_ARTICLES 
(NUMPART, DESCRIPTION, LOCATION, MAX, ACTUAL, MIN, Unidad_de_medida) 
VALUES ('" & txtNumParte.Text & "', '" & txtDescripcion.Text & "', 
    '" & txtLocaclizacion.Text & "', '" & txtMaximo.Text & "', '" & txtActual.Text & "', 
    '" & txtMin.Text & "', '" & cmbUnidad.Text & "')" 

有人知道如何使這個查詢接受查詢中的那些字符嗎?

+9

1)不要標記與MySQL標籤的SQL Server的問題。兩種完全不同的產品。 2)不要通過串聯構建SQL字符串......你只是要求SQL注入攻擊和問題完全一樣。 3)使用參數化的SQL,問題消失。 – pmbAustin

+0

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare (v=vs.110).aspx – JGFMK

+1

使用SQL參數,您還將避免數據類型不匹配錯誤和許多其他問題。創建SQL根本就不是那麼單調乏味。也請閱讀[問]並參加[遊覽] – Plutonix

回答

4

正如@pmbAustin指出的,是一個可怕的想法通過字符串連接構建sql語句由於SQL注入攻擊和其他問題。你應該使用這種方法被稱爲參數化查詢:

CMD.CommandText = "INSERT INTO (NUMPART, DESCRIPTION, LOCATION, MAX, ACTUAL, 
MIN, Unidad_de_medida) 
VALUES (@NUMPART, @DESCRIPTION,@LOCATION,@MAX,@ACTUAL,@MIN,@UNIDAD_DE_MEDIDA)" 

然後:

CMD.Parameters.Add("@NUMPART",txtNumParte.Text); 
CMD.Parameters.Add("@DESCRIPTION",txtDescripcion.Text); 
//...and so on 
CMD.ExecuteNonQuery(); 
0

使用參數化的SQL(即存儲過程)來防止SQL注入等。

至於你的問題,你希望用兩個單引號替換單引號(撇號),然後再將它作爲參數添加。這樣,第一個作爲轉義字符可以將撇號插入到數據庫中。

例子: txtNumParte.Text.Replace("'", "''")

+0

任何簡單地轉義撇號的例子都不會阻止SQL注入? –

+0

@ MichaelZ.thanks添加示例 - 使答案更加完整。至於SQL注入,防止這種情況的方法是使用參數,無論是在存儲過程中還是在Icarus提供的答案中構建插入語句。我更關注撇號部分,因爲這是OP的問題。 – Eli

+0

沒問題。我知道參數是最佳實踐,但我想知道是否逃避撇號足以防止SQL注入,我相信它是。如果你能想到一個不起作用的例子,請在這裏評論一個例子。 –