MS Access VBA更新数据时出现字符串查询语法错误,求排查
排查你的VBA Update语句错误
咱们一步一步来解决这个问题,你遇到的语法错误主要来自两个明显的代码问题,还有一个隐藏的风险点:
1. 错误的连接符导致字符串断裂
看你代码里的[JerseyNumber]那一行:
[JerseyNumber] = '"` & JerseyNumbertxtbox.Text & "'
这里你把VBA里用来拼接字符串的&符号写成了反引号`,这直接导致SQL字符串的语法彻底混乱,这是触发错误的核心原因之一。
2. 未闭合的字符串与不完整的SQL语句
最后一个字段[ShortsSize]的拼接没有闭合单引号,也没给SQL语句收尾:
[ShortsSize] = '" & ShortsSizetxtbox.Text
正常来说每个字段值的单引号都要成对出现,而且整个SQL字符串也需要用双引号闭合。
3. 隐藏风险:缺少WHERE子句的Update语句
你的Update语句没有加WHERE条件,这意味着执行后会更新表中所有记录,这绝对是你不想看到的情况,必须加上指定更新哪条记录的条件(比如根据主键ID筛选)。
修正后的代码(包含参数化查询优化)
另外,直接拼接用户输入到SQL语句里不仅容易出错,还存在SQL注入的风险,推荐改用参数化查询,既安全又避免字符串拼接的麻烦:
Private Sub SaveChanges() con.ConnectionString = OpenDBConnection() con.Open() ' 使用参数化查询,避免SQL注入和字符串拼接错误 Dim sql As String = "Update [JobOrderProd] set " & _ "[CustomerOrderNumber] = @CustomerOrderNumber, " & _ "[ItemNumber] = @ItemNumber, " & _ "[JerseyName] = @JerseyName, " & _ "[JerseyNumber] = @JerseyNumber, " & _ "[JerseySize] = @JerseySize, " & _ "[ShortsSize] = @ShortsSize " & _ "WHERE YourPrimaryKeyField = @PrimaryKeyValue" ' 替换成你的主键字段和对应值 Dim cmd As New OleDbCommand(sql, con) ' 添加参数,对应SQL里的占位符 cmd.Parameters.AddWithValue("@CustomerOrderNumber", CustomerOrderNumtxtbox.Text) cmd.Parameters.AddWithValue("@ItemNumber", ItemNumbertxtbox.Text) cmd.Parameters.AddWithValue("@JerseyName", JerseyNametxtbox.Text) cmd.Parameters.AddWithValue("@JerseyNumber", JerseyNumbertxtbox.Text) cmd.Parameters.AddWithValue("@JerseySize", JerseySizetxtbox.Text) cmd.Parameters.AddWithValue("@ShortsSize", ShortsSizetxtbox.Text) cmd.Parameters.AddWithValue("@PrimaryKeyValue", YourPrimaryKeyControl.Value) ' 替换成你的主键控件值 cmd.ExecuteNonQuery() con.Close() MsgBox("Entry for JO Production has been updated.") ClearForm() End Sub
如果暂时不想用参数化,只修正原来的语法错误的话,代码应该是这样(但还是强烈推荐参数化):
Private Sub SaveChanges() con.ConnectionString = OpenDBConnection() con.Open() Dim sql As String = "Update [JobOrderProd] set [CustomerOrderNumber] = '" & CustomerOrderNumtxtbox.Text & "', " & _ "[ItemNumber] = '" & ItemNumbertxtbox.Text & "', " & _ "[JerseyName] = '" & JerseyNametxtbox.Text & "', " & _ "[JerseyNumber] = '" & JerseyNumbertxtbox.Text & "', " & _ "[JerseySize] = '" & JerseySizetxtbox.Text & "', " & _ "[ShortsSize] = '" & ShortsSizetxtbox.Text & "' " & _ "WHERE YourPrimaryKeyField = 'YourKeyValue'" ' 必须加WHERE条件! Dim cmd As New OleDbCommand(sql, con) cmd.ExecuteNonQuery() con.Close() MsgBox("Entry for JO Production has been updated.") ClearForm() End Sub
总结一下,先修正连接符和未闭合的引号,然后一定要加上WHERE条件限定更新范围,最好改用参数化查询从根源避免这类问题。
内容的提问来源于stack exchange,提问作者Lainly Quilantang
相关产品推荐
相关产品推荐

