VBA从非绑定窗体向表插入数据时遇3134语法运行时错误求助
解决Runtime Error 3134的问题
你的SQL语法错误根源是表名包含&特殊字符,Access SQL里遇到带特殊字符(&、空格、关键字等)的对象名,必须用方括号[]包裹,否则会被解析成语法错误。另外你的DCount语句里也存在同样的表名问题,还有日期字段的条件没加#,这些都得修正。
修复现有SQL代码
把所有tbl_R&R改成[tbl_R&R],同时修正DCount里日期字段的条件:
On Error GoTo Err_Handler Dim strSQL As String ' 修正表名和日期条件的格式 If DCount("EmpDBID", "[tbl_R&R]", "EmpDBID=" & Me!EmpDBID) > 0 _ And DCount("RR_Emp_ID", "[tbl_R&R]", "RR_Emp_ID=" & Me!RR_DBID) > 0 _ And DCount("Rewarded_Date", "[tbl_R&R]", "Rewarded_Date=#" & Me!Rewarded_Date & "#") > 0 Then MsgBox "This data has already been entered into the Database" Exit Sub Else ' 表名用方括号包裹 strSQL = "INSERT INTO [tbl_R&R] (EmpDBID, Rewarded_Date, RR_DBID, Nominated_by) VALUES (" & Me!EmpDBID & ", #" & Me!Rewarded_Date & "#, " & Me!RR_DBID & ", " & Me!Nominated_by & ");" DoCmd.RunSQL strSQL End If Exit Sub Err_Handler: MsgBox "Error has occurred: " & Err.Description ' 加上错误描述更便于排查 End Sub
更安全的替代方法:用DAO记录集插入数据
拼接SQL容易遇到类型转换、特殊字符的问题,用DAO记录集可以避免这些麻烦,步骤如下:
- 确保引用了Microsoft DAO Object Library(VBA编辑器→工具→引用)
- 使用以下代码:
On Error GoTo Err_Handler Dim rs As DAO.Recordset ' 打开表的记录集 Set rs = CurrentDb.OpenRecordset("[tbl_R&R]", dbOpenDynaset) ' 检查重复(改成组合条件判断,逻辑更准确) If DCount("EmpDBID", "[tbl_R&R]", "EmpDBID=" & Me!EmpDBID & " AND RR_Emp_ID=" & Me!RR_DBID & " AND Rewarded_Date=#" & Me!Rewarded_Date & "#") > 0 Then MsgBox "This data has already been entered into the Database" rs.Close Set rs = Nothing Exit Sub End If ' 添加新记录 rs.AddNew rs!EmpDBID = Me!EmpDBID rs!Rewarded_Date = Me!Rewarded_Date rs!RR_DBID = Me!RR_DBID rs!Nominated_by = Me!Nominated_by rs.Update ' 关闭记录集 rs.Close Set rs = Nothing Exit Sub Err_Handler: MsgBox "Error has occurred: " & Err.Description If Not rs Is Nothing Then If rs.State = dbOpen Then rs.Close Set rs = Nothing End If End Sub
这个方法不用手动拼接SQL,直接赋值字段,减少语法错误的概率,也更易维护。
内容的提问来源于stack exchange,提问作者mrk777
相关产品推荐
相关产品推荐

