撇号导致SQL UPDATE失败

时间:2011-12-07 14:17:57

标签: vb.net tsql

我遇到了SQLCommand查询更新处理撇号的问题。我有一个gridview,接受可能有撇号和其他这样的重音字符的编辑文本。

UPDATE不断在输入的文本中的撇号上抛出错误,导致SQL UPDATE失败。

以下是代码:

Dim lbl1 As Label = GridView3.Rows(e.RowIndex).Cells(0).FindControl("Label1")
IDVal = lbl1.Text

' New translation
Dim TB1 As TextBox = GridView3.Rows(e.RowIndex).Cells(0).FindControl("TextBox1")
updateString = TB1.Text
updateString = HttpUtility.HtmlAttributeEncode(updateString)

' Brief Description
Dim TB2 As TextBox = GridView3.Rows(e.RowIndex).Cells(0).FindControl("TextBox2")
newBrief = TB2.Text

If newBrief = "" Then
    newBrief = DBNull.Value.ToString
Else
   newBrief = TB2.Text
End If

'    update the corresponding string value for Record
rootTableUpdate = "UPDATE " + userTable + " SET lang_String = '" + updateString + "', date_Changed ='" + myDate + "', prev_LangString = '" + Session("oldString") + "', brief_Descrip = '" + newBrief + "', needsTranslation = 'False', submittedBy= '" + userName + "' WHERE [Id] = " + IDVal + ";"

Dim command1 As New SqlCommand(rootTableUpdate, connection)
connection.Open()
command1.ExecuteNonQuery()
connection.Close()

下面的错误实际上是:d'alimentation.

  

“营养”附近的语法不正确。
  字符串'WHERE [Id] = 258;'后面的未闭合引号。
  描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:

  

System.Data.SqlClient.SqlException:'alimentation'附近的语法不正确   字符串'WHERE [Id] = 258;'。

后的未闭合引号

来源错误:

Line 164:            Dim command1 As New SqlCommand(rootTableUpdate, connection)
Line 165:            connection.Open()
Line 166:            command1.ExecuteNonQuery()

SQEE,VB.net

3 个答案:

答案 0 :(得分:3)

您的代码很容易SQL Injection

使用参数化查询。

Dim cmd As New SqlCommand("UPDATE Table SET ColA=@ColA, ColB=@ColB", Conn)
cmd.Parameters.Add("@ColA", SqlDbType.Int).Value = ColA
cmd.Parameters.Add("@ColB", SqlDbType.Int).Value = ColB
cmd.ExecuteNonQuery()

这也可以防止你使用撇号的问题。

答案 1 :(得分:2)

如果您对调用进行参数化(如@ Curt的示例),而不是连接字符串:

答案 2 :(得分:1)

您应该使用参数化查询而不是连接字符串。

这既可以避免您遇到的问题,也可以帮助防范SQL Injection

我可以看到你正在传递表名,所以你必须使用dynamic SQL - 你需要通过加倍来逃避任何单个',否则它将充当字符串终止符。

你仍然需要减少SQL注入 - 只是加倍撇号在这方面无济于事。

或者,考虑一个不需要动态表名的设计或者在存储过程中构造动态SQL并使用参数的设计,因此您至少可以在一定程度上清理传入的参数。