2017-07-06 56 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注入,我相信它是。如果你能想到一个不起作用的例子,请在这里评论一个例子。 –