Access VBA运行查询报3078错误但保存查询可正常执行如何解决
问题原因
你构造strSQL变量时在首尾额外添加了多余的双引号,导致OpenRecordset方法将整段包裹了双引号的SQL文本识别为要打开的表/查询名称,而非要执行的SQL语句,因此抛出3078错误。你将拼接结果复制到查询生成器时,会自动忽略/手动删掉了外层多余的双引号,所以可以正常运行。
修复方法
1. 核心修改:去掉SQL首尾的多余双引号
修改strSQL的赋值逻辑,删除首尾的"""即可解决报错:
Dim db As DAO.Database Dim rs As DAO.Recordset Dim vTime As String Dim vDate As String vTime = Forms!frmEditDay!cmbStartTime vDate = Forms!frmEditDay!cmbDate Set db = CurrentDb ' 仅删除首尾多余的三个双引号,即可解决核心问题 strSQL = "SELECT tblSpring2022.ID, tblSpring2022.fldDate, tblSpring2022.fldTime, tblSpring2022.fldUserName " _ & vbCrLf & "FROM tblSpring2022 " _ & vbCrLf & "WHERE (((tblSpring2022.fldTime) = " & Chr(34) & vTime & Chr(34) & ") And ((tblSpring2022.fldDate) = " & Chr(34) & vDate & Chr(34) & ")) " _ & vbCrLf & "ORDER BY tblSpring2022.fldTime;" Set rs = db.OpenRecordset(strSQL)
2. 可选优化建议
为了避免后续出现其他隐式错误,建议同步调整以下写法:
- Access 日期类型字段的过滤值需要用
#包裹,而非双引号,同时固定日期格式避免系统区域设置导致的识别异常 - 字符串过滤值用单引号包裹更简洁,遇到值本身包含单引号的场景,用
Replace转义即可 - 不需要额外添加
vbCrLf换行符,SQL执行时会自动忽略空白字符
优化后的代码参考:
strSQL = "SELECT ID, fldDate, fldTime, fldUserName " & _ "FROM tblSpring2022 " & _ "WHERE fldTime = '" & Replace(vTime, "'", "''") & "' " & _ "AND fldDate = #" & Format(vDate, "yyyy/mm/dd") & "# " & _ "ORDER BY fldTime;"
3. 调试技巧
拼接完SQL后添加一行Debug.Print strSQL,可以在VBA编辑器的立即窗口查看实际生成的SQL内容,能快速发现引号多余、拼接错误等问题。
内容的提问来源于stack exchange,提问作者Michael E. Ehinger
相关产品推荐
相关产品推荐

