【问题标题】:Runtime Issue 3012 Access运行时问题 3012 访问
【发布时间】:2026-01-16 13:40:01
【问题描述】:
Dim db As DAO.Database
Set db = CurrentDb()
Dim qd As DAO.QueryDef
Dim sqlQry As String

sqlQry = "SELECT x,y,z " & _
"INTO MyTable2 " & _
"FROM mytable1 " & _
"WHERE ((Condition1) And (Condition2)) "

Set qd = db.CreateQueryDef("MyQueryName", sqlQry) 
DoCmd.OpenQuery (qd.Name)
Set qd = Nothing
Set db = Nothing
End Sub 

嗨 我只是想在 Access VBA 中运行查询并不断收到运行时错误“3012”对象 MyQueryName 已存在于行:

Set qd = db.CreateQueryDef("MyQueryName", sqlQry)

现在我没有:

Set qd = Nothing

并认为这是问题所在。但是在添加它之后我仍然得到了错误然后我记得因为我在 qd 对象上出现了错误它可能还没有清除所以运行它并注释掉这两行所以它绕过并直接进入对象重置:

Set qd = db.CreateQueryDef("MyQueryName", sqlQry) 
DoCmd.OpenQuery (qd.Name)

但之后它仍然给我这个错误。难倒困惑等等!

你们有什么想法吗?

谢谢

安德鲁

【问题讨论】:

    标签: vba ms-access error-handling


    【解决方案1】:

    当查询已经存在时,您不能创建查询。您可以删除查询,首先检查它是否存在,或者您可以更新 sql

    db.QueryDefs("MyQueryName").SQL= sqlQry
    

    所以:

    If DLookup("Name", "MSysObjects", "Name= 'MyQueryName'") <> "" Then
        Set qdf = CurrentDb.QueryDefs("MyQueryName")
        qdf.SQL = sqlQry
    Else
        Set qdf = CurrentDb.CreateQueryDef("MyQueryName", sqlQry)
    End If
    

    【讨论】:

    • 如何检查这是否已经存在?我似乎没有从我应该寻找的对象的扩展中理解。我浏览了这段代码,为什么我不能每次都创建新鲜的对象?
    • 我发了一个例子来检查,你错过了吗?