使用DoCmd.RunSQL执行SELECT语句出现运行时错误2342/3129如何解决?
错误根因
- 你的SQL字符串本身没有语法问题,所有报错均由调用
DoCmd.RunSQL方法执行普通SELECT查询导致。 DoCmd.RunSQL仅支持操作查询和数据定义查询,官方文档明确列出的支持语句中,仅SELECT...INTO(生成表操作查询)可被执行,普通返回结果集的SELECT查询不在支持范围内,你此前收到的“DoCmd.RunSQL仅支持SELECT查询、不支持操作查询”的说法是完全错误的。- 你尝试添加额外引号、用
Chr(34)替换引号的操作属于无效排查,反而会破坏原本正确的SQL语法,触发3129错误。
对应解决方案
根据你使用SELECT查询结果的不同场景选择对应方法:
场景1:需要在VBA代码中读取查询结果做逻辑处理
使用DAO Recordset加载查询结果,示例代码如下:
Dim rs As DAO.Recordset ' 后续可将此处的tblFall2021替换为你定义的表名变量,实现动态查询 SqlStr = "SELECT tblFall2021.fldUserID, tblFall2021.fldDate, tblFall2021.fldTime, tblFall2021.fldUserName, " & _ " tblVolunteers.ID, tblVolunteers.fldPhone, tblVolunteers.fldEmail, tblVolunteers.[fldChurch/Parish], " & _ " tblVolunteers.fldGroup, tblVolunteers.[fldCouncil/Court] " & _ " FROM tblFall2021 INNER JOIN tblVolunteers ON tblFall2021.[fldUserID] = tblVolunteers.[ID] " & _ " WHERE tblFall2021.fldDate='9/22/2021';" Set rs = CurrentDb.OpenRecordset(SqlStr) ' 示例:遍历结果集读取数据 Do While Not rs.EOF Debug.Print rs!fldUserID, rs!fldUserName rs.MoveNext Loop ' 用完释放资源 rs.Close Set rs = Nothing
场景2:需要将查询结果直接展示给前端用户
可以创建临时查询后打开,示例代码如下:
Dim qdf As DAO.QueryDef Const TEMP_QUERY As String = "tmpDynamicQuery" ' 清理已存在的同名临时查询 On Error Resume Next CurrentDb.QueryDefs.Delete TEMP_QUERY On Error GoTo 0 ' 生成动态查询 Set qdf = CurrentDb.CreateQueryDef(TEMP_QUERY, SqlStr) ' 打开查询展示结果 DoCmd.OpenQuery TEMP_QUERY Set qdf = Nothing
如果不需要保留临时查询,关闭窗口后可主动删除该查询定义。
内容的提问来源于stack exchange,提问作者Michael E. Ehinger
相关产品推荐
相关产品推荐

