【问题标题】:Syntax error SQL query using UPDATE使用 UPDATE 的语法错误 SQL 查询
【发布时间】:2014-08-12 17:17:32
【问题描述】:

上下文

我在我的网站上添加了修改密码和电子邮件地址的选项。我有一个 Microsoft Access 数据库。它在“Login”表中有“EmailAddress”、“Password”和“Username”列。

代码

'For testing purposes, lets say :
VB_PasswordTXT = "1000:8NHLJo5oIDugFdzscuMrNSKyoNTRa0kI:6NSlpqGYC4zU2BG6cfJaHaPgVRCDPCc2"
VB_UserNameTXT = "Test123"
VB_EmailTXT = "a@mail.com"

Using thisConnection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""path""")
    Using thisCommand As OleDbCommand = thisConnection.CreateCommand
        ' Open connection object
        thisConnection.Open()

        ' Initialize SQL SELECT command to retrieve desired data
        thisCommand.CommandText = "UPDATE Login SET EmailAddress = @EmailAddress, Password = @Password " & _
                                "WHERE Username = @Username"
        thisCommand.Parameters.AddWithValue("@Username", VB_UserNameTXT)
        thisCommand.Parameters.AddWithValue("@EmailAddress", VB_EmailTXT)
        thisCommand.Parameters.AddWithValue("@Password", VB_PasswordTXT)

        ' Create a DataReader object based on previously defined command object
        Dim thisReader As OleDbDataReader = thisCommand.ExecuteReader() 'Crashes here
        If thisReader.Read() Then
        End If

        thisReader.Close()
        thisConnection.Close()
    End Using
End Using

崩溃日志

UPDATE 命令中的语法错误。 (法语免费翻译)

问题

(据我所知),问题来自UPDATE 语法。它有什么问题?

【问题讨论】:

    标签: asp.net vb.net web-applications ms-access-2007


    【解决方案1】:

    密码是 MS-Access 中的 reserved keyword
    当你有一个以这种方式命名的字段时,你应该将它括在方括号中

      thisCommand.CommandText = "UPDATE Login SET EmailAddress = @EmailAddress, " & _
                                "[Password] = @Password " & _
                                "WHERE Username = @Username"
    

    如果仍然可行,我建议更改该名称

    而且,当 ExecuteReader 工作时,用于 UPDATE/INSERT/DELETE sql 的正确方法是

        thisCommand.ExecuteNonQuery() 
    

    调用 ExecuteReader 不好,因为您强制它创建一个在更新时不需要的 OleDbDataReader。

    编辑
    阅读您的最后一条评论,我注意到您在集合中以错误的顺序添加了参数。 OleDb 不通过名称识别参数,而是通过它们在参数集合中的位置来识别参数。您应该按照它们各自占位符在命令文本中出现的确切顺序添加它们(将用户名移动到最后添加的用户名)

       thisCommand.CommandText = "UPDATE Login SET EmailAddress = @EmailAddress, " & _ 
                                 "[Password] = @Password " & _
                                 "WHERE Username = @Username"
        thisCommand.Parameters.AddWithValue("@EmailAddress", VB_EmailTXT)
        thisCommand.Parameters.AddWithValue("@Password", VB_PasswordTXT)
        thisCommand.Parameters.AddWithValue("@Username", VB_UserNameTXT)
    

    【讨论】:

    • 作为附录,最好将所有表名和列名放在方括号中。
    • 我会接受这个答案,因为它解决了我的崩溃问题。 (为了清楚起见,我实际上更改了列名)。现在,我试图弄清楚为什么它实际上并没有更新值。问题是,我还有其他UPDATE 查询可以正常工作。哦,好的,谢谢!
    • @Grim,使用别名是更好的做法,因此不需要方括号。任何人都不应在字段/列名称中包含空格或保留字符。
    • @grim 也许这不是很清楚,如果使用别名,还可以避免诸如来自不同表的两列具有相同名称以及保留字等问题。例如login.passwordl.password 将起作用。
    • @Steve,我刚刚发现了问题(有序参数)并打算在这里写下来,但看起来你甚至发现了!再次感谢,现在一切正常。
    猜你喜欢
    • 2015-09-01
    • 2012-02-21
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多