运行INSERT语句插入incidentlog表时遇Error 3075,求排查
Access VBA插入数据触发Error 3075的原因分析
执行VBA生成的INSERT语句向incidentlog表插入数据时触发运行时错误Error 3075,Debug.Print输出的SQL语句看似正常,但实际存在语法问题。
涉及的VBA代码
mySQL = "INSERT INTO incidentlog (mon, yr, observation) VALUES (" & Me.Combo37.Column(0) & ", " & Me.Combo39.Column(0) & ", " & Me.Combo10.Column(0) & ": " & Me.Text12 & "" & vbCrLf & "--" & Me.Combo35 & "" & Me.Combo37 & "" & Me.Combo39 & "/" & Me.Combo18 & "/" & Me.Text16 & "/COR " & Me.Text21 & " " & Me.Combo25.Column(2) & ")" Debug.Print mySQL DoCmd.RunSQL mySQL
字段类型说明
其中combo35、combo39、text16为数值型字段。
Debug输出的SQL示例
INSERT INTO incidentlog (mon, yr, observation) VALUES (Jan, 2022, PO-02: EDITED OUT. --01Jan2022/EDITED OUT/0700/COR my notes here USER)
错误原因分析
- 字符串型字段未用单引号包裹:
SQL语法要求字符串类型的字段值必须用单引号'括起来。从输出的SQL可以看到,mon的Jan、observation的长文本内容都没有加单引号,数据库会把Jan误识别为字段名或关键字,直接触发语法错误。 - SQL语句包含换行符:
VBA代码里用了vbCrLf生成换行,虽然Debug显示正常,但数据库解析SQL时,换行符会破坏语句的连续性,导致语法解析失败。 - 字段值包含SQL注释符号:
observation字段值里的--是SQL的单行注释标记,数据库会将--之后的内容视为注释,导致observation的取值不完整,语句逻辑断裂。
修正建议
推荐用参数化查询彻底避免这类语法问题,或者手动处理字符串:
- 给所有字符串字段值添加单引号;
- 替换字段值中的单引号为两个单引号(避免转义错误);
- 移除换行符或替换为空格;
- 转义或移除SQL注释符号。
示例修正代码:
' 处理字符串特殊字符 Dim obsContent As String obsContent = Me.Combo10.Column(0) & ": " & Me.Text12 & "--" & Me.Combo35 & Me.Combo37 & Me.Combo39 & "/" & Me.Combo18 & "/" & Me.Text16 & "/COR " & Me.Text21 & " " & Me.Combo25.Column(2) obsContent = Replace(obsContent, "'", "''") ' 转义单引号 obsContent = Replace(obsContent, vbCrLf, "") ' 移除换行 ' 生成正确的SQL语句 mySQL = "INSERT INTO incidentlog (mon, yr, observation) VALUES ('" & Me.Combo37.Column(0) & "', " & Me.Combo39.Column(0) & ", '" & obsContent & "')" Debug.Print mySQL DoCmd.RunSQL mySQL
内容的提问来源于stack exchange,提问作者user2002716
相关产品推荐
相关产品推荐

