我遇到了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
答案 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并使用参数的设计,因此您至少可以在一定程度上清理传入的参数。