列值Vb附近的语法错误

时间:2017-10-20 05:45:34

标签: sql sql-server vb.net

我正在从文本框传递列名,我在表中有相同的列名,但我收到语法错误:

 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()

2 个答案:

答案 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注入攻击,但如果您真的必须通过文本框获取列名,则无法避免。