【问题标题】:Insert data to a SQL Server database that contains apostrophes将数据插入到包含撇号的 SQL Server 数据库
【发布时间】:2017-07-06 21:27:22
【问题描述】:

我正在 Vb.net 2012 上制作这个程序,它与 SQL Server 2012 有连接。

此数据库表的一列是Description,在某些情况下,日期可能包含撇号,例如...'chainsaw 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 & "')"

有人知道如何让这个查询接受查询中的那些字符吗?

【问题讨论】:

  • 1) 不要使用 MySQL 标记标记 SQL Server 问题。两种完全不同的产品。 2)不要通过连接构建 SQL 字符串......你只是要求 SQL 注入攻击和完全类似的问题。 3)使用参数化SQL,问题就消失了。
  • 使用 SQL 参数,您还可以避免数据类型不匹配错误和许多其他问题。创建 SQL 并不意味着那么乏味。也请阅读How to Ask 并采取tour

标签: sql sql-server vb.net


【解决方案1】:

正如@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();

【讨论】:

    【解决方案2】:

    使用参数化 SQL(即存储过程)来防止 SQL 注入等。

    至于您的问题,您希望在将单引号(撇号)添加为参数之前将其替换为两个单引号。这样,第一个字符充当转义字符,允许将撇号插入数据库。

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

    【讨论】:

    • 任何简单地转义撇号不会停止 SQL 注入的例子?
    • @MichaelZ.thanks 添加示例 - 使答案更完整。至于SQL注入,防止这种情况的方法是使用参数,无论是在存储过程中还是在Icarus提供的答案中构建插入语句。我更关注撇号部分,因为那是 OP 的问题。
    • 没问题。我知道参数是最佳实践,但我想知道转义撇号是否足以防止 SQL 注入,我相信确实如此。如果您能想到一个不起作用的示例,请在此处评论示例。
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多