我正在从文本框传递列名,我在表中有相同的列名,但我收到语法错误:
UpdateQuery = "UPDATE Teo SET '" & TextBox2.Text & "' = @DEBIT_HEAD WHERE TEO_NUM = @TEO_NUM"
Dim cmd As SqlCommand = New SqlCommand(UpdateQuery, conn)
cmd.Parameters.AddWithValue("@DEBIT_HEAD", TextBox3.Text)
cmd.Parameters.AddWithValue("@TEO_NUM", TextBox1.Text)
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
答案 0 :(得分:4)
删除单引号。
UpdateQuery = "UPDATE Teo SET " & TextBox2.Text & " = @DEBIT_HEAD WHERE TEO_NUM = @TEO_NUM"
或使用方括号代替单引号:
UpdateQuery = "UPDATE Teo SET [" & TextBox2.Text & "] = @DEBIT_HEAD WHERE TEO_NUM = @TEO_NUM"
为了避免SQL注入,必须准备sql语句并将输入参数的值注入其中。准备过程确保了用户输入的正确转义。这意味着用户输入值(无论它们是什么)将被视为普通字符串。是的,即使它们是一些特定于SQL的代码。
Here is a tutorial关于vb.net中的预处理语句。
您的代码在SQL注入方面几乎是安全的,因为我看到您首先准备您的语句。但是,正如更多用户所指出的那样,您的sql语句仍然存在SQL注入的风险,因为您正在使用自定义列名称,用户可以使用文本框值进行分配。通常,应该完全避免这种情况。如果没有,那么您可以使用适合仅由您(开发人员)正确定制的表单控件。像组合框或只读文本框。如果无法做到这一点,则必须正确过滤,清理和转义定义列名的用户输入。
答案 1 :(得分:4)
遗憾的是,您必须从表中读取列名称,尝试设计应用程序可能是值得的,因此您不必这样做。
如果失败,你无法按照@aendeerei在答案中建议的那样参数化查询。
对于MSSQL,您可以使用以下语法:
UpdateQuery = "UPDATE Teo SET [" & TextBox2.Text & "] = @DEBIT_HEAD WHERE TEO_NUM = @TEO_NUM"
这绝对比省略[
和]
分隔符更好,因为没有这些分隔符,它不会接受不规则或保留的关键字列名。
请注意,即使这样,您的代码也容易受到SQL注入攻击,但如果您真的必须通过文本框获取列名,则无法避免。