【问题标题】:Incorrect syntax near '(''(' 附近的语法不正确
【发布时间】:2014-06-15 15:33:06
【问题描述】:

我有一个关于更新表中数据的问题。代码如下:

Dim cmdUp As New SqlCommand("UPDATE TblQuestion SET (QuestionTxt =" + question.Text + ") where QuestionId=@id", conn) 

conn.Open()
cmdUp.Parameters.AddWithValue("@id", result)

cmdUp.ExecuteNonQuery()
conn.Close()

一个错误,'(' 附近的语法不正确出现在cmdUp.ExecuteNonQuery() 行。 那么,我想如何解决这个错误?

【问题讨论】:

    标签: asp.net sql-server vb.net


    【解决方案1】:

    这将解决您的错误。

    Dim cmdUp As New SqlCommand("UPDATE TblQuestion SET QuestionTxt ='" + 
                                question.Text + "' where QuestionId=@id", conn) 
    

    但是你有一个更多更大的问题。此代码将允许 SQL 注入攻击。

    HT:http://xkcd.com

    【讨论】:

    • 那么我想如何解决这个问题?有什么想法吗?
    • google搜索sql注入得到了微软的优秀文章:technet.microsoft.com/en-us/library/ms161953(v=sql.105).aspx
    • 当我刚刚更改您的代码时,我得到的错误是 cmdUp.ExecuteNonQuery() 行的列名无效
    • 转到“将参数集合与动态 SQL 一起使用”部分——这将为您提供最直接的代码转换。
    • @luly 那么我猜你的列名无效。您的列是否命名为 QuestionTxtQuestionID
    【解决方案2】:

    您的问题是由暂定传递字符串值而不用单引号引起来的。将您的question.Text 放在单引号之间可以解决问题。但这不是处理用作 sql 命令的字符串文本的正确方法。

    这种情况只有一种方法。使用参数化查询(顺便说一下,你的查询有一半已经参数化了,那为什么不用问题文本呢?)

    Dim cmdUp As New SqlCommand("UPDATE TblQuestion " & _
                                "SET QuestionTxt =@quest " & _
                                "where QuestionId=@id", conn) 
    
    conn.Open()
    cmdUp.Parameters.AddWithValue("@id", result)
    cmdUp.Parameters.AddWithValue("@quest", question.Text)
    cmdUp.ExecuteNonQuery()
    conn.Close()
    

    参数化查询避免了其他答案中解释的 Sql Injection,但也避免了解析错误。如果您的用户键入包含单引号的问题会发生什么?我收到另一个语法错误。

    【讨论】:

    • 你能在VB中使用@""吗?
    • @Ciarán 对不起。你说得对,现在修好了
    猜你喜欢
    • 2015-12-12
    • 2013-12-16
    • 1970-01-01
    • 2018-08-14
    • 2011-03-11
    • 2014-02-16
    • 2017-01-11
    • 2020-02-06
    相关资源
    最近更新 更多