访问vba-使用循环中的记录集时出现运行时错误3420(无效对象)

访问vba-使用循环中的记录集时出现运行时错误3420(无效对象),vba,ms-access,recordset,Vba,Ms Access,Recordset,我有以下问题,我不能通过。 我正在尝试在循环中创建记录集。其想法是向数据库中添加一些与用户表单中用户选择的日期范围相关的条目。当用户只选择一个日期时,代码工作正常,但当用户选择日期范围时,它会在第二个循环过程中发生上述运行时错误,即对象无效或没有值。 这是我的代码(事实上是其中的一部分,为了说明问题而稍微简化): 非常感谢任何提示。 事先非常感谢 关于我试过这个小部件,它在第二圈也给了我3420 Sub TestMe() Dim dbs As DAO.Database Dim q

我有以下问题,我不能通过。 我正在尝试在循环中创建记录集。其想法是向数据库中添加一些与用户表单中用户选择的日期范围相关的条目。当用户只选择一个日期时,代码工作正常,但当用户选择日期范围时,它会在第二个循环过程中发生上述运行时错误,即对象无效或没有值。 这是我的代码(事实上是其中的一部分,为了说明问题而稍微简化):

非常感谢任何提示。 事先非常感谢


关于

我试过这个小部件,它在第二圈也给了我3420

Sub TestMe()
    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef

    Set dbs = CurrentDb
    Dim x As Long

    For x = 0 To 3
        Set qdf = dbs.CreateQueryDef("", "SELECT * FROM TABELLE1")
        dbs.Close
    Next x

End Sub

因此,问题在于,您在第一次迭代中关闭了
dbs
,然后引用它。

不要为每个循环迭代创建新的查询。只需使用一个查询,并使用参数插入不同的数据

正如Vityta所指出的,真正的问题是,在第一次迭代中,您正在关闭
dbs
。我也解决了这个问题。但我就是无法优化这段代码

Dim sql, sql2 As String
Dim x, daty As Integer

Dim dbs As DAO.Database
Set dbs = CurrentDb
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
sql = "INSERT INTO tDzialaniaRejestracja (IdSzkolenia, TerminRozpoczecia) VALUES (@Param1, @Param2)"
Set qdf = dbs.CreateQueryDef("", sql)  
For x = 0 To 3   
     qdf.Parameters("@Param1") = Me.IdSzkolenia
     qdf.Parameters("@Param2") = Format((Me.DataRozpoczecia + x), "dd.mm.yyyy")
     With dbs
        qdf.Execute dbFailOnError
        sql2 = "SELECT @@IDENTITY"
        Set rs = .OpenRecordset(sql2, dbOpenDynaset)
        lastID = rs.Fields(0)
        rs.Close
     End With

     Me.IdDzialania = lastID
     Me.ProwadzacyFirmaZewn.Value = 23
     Set rs = Nothing
Next x
'Not necessary, no benefit whatsoever in the following code, but it goes here if you want it
dbs.Close
Set dbs = Nothing
Set qdf = Nothing

这还有许多额外的优点,例如只允许访问编译查询一次,简化代码,避免可能的SQL注入,等等。

write
Debug.Print SQL
,在出现错误消息之前。你得到了什么?试着打开
dbs
,在第一次循环后你将关闭它。或者根本不要关闭它。非常感谢,让数据库保持打开状态就成功了。
Dim sql, sql2 As String
Dim x, daty As Integer

Dim dbs As DAO.Database
Set dbs = CurrentDb
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
sql = "INSERT INTO tDzialaniaRejestracja (IdSzkolenia, TerminRozpoczecia) VALUES (@Param1, @Param2)"
Set qdf = dbs.CreateQueryDef("", sql)  
For x = 0 To 3   
     qdf.Parameters("@Param1") = Me.IdSzkolenia
     qdf.Parameters("@Param2") = Format((Me.DataRozpoczecia + x), "dd.mm.yyyy")
     With dbs
        qdf.Execute dbFailOnError
        sql2 = "SELECT @@IDENTITY"
        Set rs = .OpenRecordset(sql2, dbOpenDynaset)
        lastID = rs.Fields(0)
        rs.Close
     End With

     Me.IdDzialania = lastID
     Me.ProwadzacyFirmaZewn.Value = 23
     Set rs = Nothing
Next x
'Not necessary, no benefit whatsoever in the following code, but it goes here if you want it
dbs.Close
Set dbs = Nothing
Set qdf = Nothing