Access VBA运行时错误2046:Requery命令当前不可用问题咨询
解决Access中DoCmd.Requery查询时的运行时错误2046
你碰到的这个运行时错误2046,根源其实很明确——你用错了DoCmd.Requery的参数。这个方法根本不能直接接收查询名称作为输入,它的设计目标是刷新窗体、子窗体或者窗体上的控件(比如列表框、组合框),让这些控件重新拉取数据源的最新数据。你直接传查询名,Access找不到对应的刷新目标,自然就抛出“命令或操作不可用”的错误了。
针对你的场景,你需要重新执行MyTaskQuery这个包含INSERT逻辑的查询,正确的做法是用DoCmd.OpenQuery来运行它,而不是Requery。调整后的代码应该是这样的:
SQL = "Delete * From MyTasks Where UserName = '" & User & "';" DoCmd.RunSQL SQL ' 直接运行MyTaskQuery来执行它的INSERT和筛选逻辑 DoCmd.OpenQuery "MyTaskQuery", acViewNormal, acEdit ' 再运行MyTasksActions查询 DoCmd.OpenQuery "MyTasksActions"
如果你的MyTaskQuery是某个窗体控件的数据源(比如列表框绑定了这个查询),那你应该针对那个控件或者窗体做Requery,比如:
' 假设窗体上的列表框叫lstMyTasks,数据源是MyTaskQuery Me.lstMyTasks.Requery ' 或者刷新整个窗体的数据源 Me.Requery
另外给你提两个额外的注意点:
- 避免SQL注入风险:你现在直接把
User变量拼进Delete语句里,如果User的值包含单引号(比如用户名叫O'Neil),会直接导致SQL语法错误,甚至存在注入风险。建议改用参数化查询,示例代码如下:
Dim qdf As QueryDef Set qdf = CurrentDb.CreateQueryDef("", "Delete * From MyTasks Where UserName = [UserNameParam];") qdf.Parameters("UserNameParam") = User qdf.Execute dbFailOnError Set qdf = Nothing
- 检查查询的存在性和权限:确保MyTaskQuery和MyTasksActions这两个查询在数据库里确实存在,拼写也没有错误;另外确认当前用户有执行删除、插入操作的权限,虽然这不是你当前错误的直接原因,但也是后续可能踩坑的点。
内容的提问来源于stack exchange,提问作者Tom36
相关产品推荐
相关产品推荐

