您输入的表达式是指已关闭或不存在的对象错误

问题描述 投票:1回答:3

我试图在按钮点击事件上打开2个ADODB记录集,如:

    Private Sub btn1_Click()
        Dim rs As New ADODB.Recordset
        Dim rst As New ADODB.Recordset

         rs.Open "UPDATE table ITEM = " & Me.ITEM & " where ID = " & ID, CurrentProject.Connection
       rs.Close
       Set rs = Nothing

      rst.Open "Update Table2 set Item2 = " & Me.Item2,CurrentProject.Connection

End Sub

我得到的第一个错误是在rs.close,它说:

关闭对象时不允许操作。

我真的很困惑这个错误,因为我显然没有关闭记录集rs

但即使我删除rs.close我得到:

您输入的表达式是指已关闭或不存在的对象

在...上

rst.Open "Update Table2 set Item2 = " & Me.Item2,CurrentProject.Connection

ms-access access-vba
3个回答
2
投票

发生了第一个错误(在rs.Close上),因为记录集从未打开过。

您的UPDATE(当您包含SET关键字时)已成功执行,但UPDATE不会返回记录。所以记录集没有打开。运行以下代码以澄清情况......

Dim rs As New ADODB.Recordset
Dim strUpdate As String

strUpdate = "UPDATE table SET ITEM = " & Me.item & " where ID = " & id
rs.Open strUpdate, CurrentProject.Connection
If rs.State = adStateClosed Then
    Debug.Print "can't close recordset because it's already closed"
Else
    rs.Close
End If

当你想执行UPDATE时,你不需要记录集;你甚至不需要ADO。你可以这样做......

CurrentDb.Execute strUpdate, dbFailOnError

关于你的第二个错误,我不确定原因,但怀疑问题在于构建语句文本。建议你将它添加到你的代码并运行它...

Debug.Print "Update Table2 set Item2 = " & Me.Item2

如果这不会触发相同的错误,请从“立即”窗口复制语句文本,并将其粘贴到Access查询设计器中的新查询的SQL视图中进行测试。如果您不熟悉立即窗口,Ctrl + g将带您到那里。


1
投票

.Open方法不适用于动作查询,而是适用于选择查询。


1
投票

由于您正在评估update语句,您应该使用.ExecuteADODB Connection object方法而不是.Open方法。

© www.soinside.com 2019 - 2024. All rights reserved.