Access使用INSERT INTO VALUES语句报运行时错误3078问题求助
错误根因
你拼接SQL字符串时在外层额外多加了两层双引号,导致最终传给Access数据库引擎的是被双引号包裹的整段SQL文本,引擎无法识别这是可执行的SQL语句,会直接将其当作表/查询的名称去查找,因此触发3078错误。
修复方案
基础修复(字符串拼接写法)
首先移除最外层多余的""",同时给所有字符串类型的字段值包裹单引号,还要转义字段值中自带的单引号避免语法报错,修复后代码如下:
Dim strSQL As String strSQL = "INSERT INTO tblVolunteers " & vbCrLf & _ "VALUES ('" & Replace([txtTitle], "'", "''") & "','" & Replace([txtFirstName], "'", "''") & "','" & Replace([txtMiddle], "'", "''") & "','" & Replace([txtLastName], "'", "''") & "','" & Replace([txtEmail], "'", "''") & _ "','" & Replace([txtPhone], "'", "''") & "','" & Replace([txtChurch], "'", "''") & "','" & Replace([txtGroup], "'", "''") & "','" & Replace([txtCouncil], "'", "''") & "'," & [chkParCo] & ",'" & _ Replace([txtMailAdd], "'", "''") & ");" ' 调试:按Ctrl+G可在VBA编辑器立即窗口查看拼接完成的完整SQL,方便排查问题 Debug.Print strSQL CurrentDb.Execute strSQL, dbFailOnError
更安全的优化方案(参数化查询)
字符串拼接写法容易出现语法问题、存在SQL注入风险,更推荐使用参数化查询,不需要处理符号转义,代码更稳定:
Dim qdf As DAO.QueryDef Dim strSQL As String ' 字段名请和你实际表tblVolunteers的字段名保持一致 strSQL = "INSERT INTO tblVolunteers (title, firstName, middle, lastName, email, phone, church, groupName, council, parCo, mailAdd) " & _ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" Set qdf = CurrentDb.CreateQueryDef("", strSQL) ' 按SQL中参数的顺序依次赋值 qdf.Parameters(0) = [txtTitle] qdf.Parameters(1) = [txtFirstName] qdf.Parameters(2) = [txtMiddle] qdf.Parameters(3) = [txtLastName] qdf.Parameters(4) = [txtEmail] qdf.Parameters(5) = [txtPhone] qdf.Parameters(6) = [txtChurch] qdf.Parameters(7) = [txtGroup] qdf.Parameters(8) = [txtCouncil] qdf.Parameters(9) = [chkParCo] qdf.Parameters(10) = [txtMailAdd] qdf.Execute dbFailOnError Set qdf = Nothing
内容的提问来源于stack exchange,提问作者Michael E. Ehinger
相关产品推荐
相关产品推荐

