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

时间:2019-04-01 17:02:04

标签: ms-access access-vba

我试图在按钮单击事件上打开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

3 个答案:

答案 0 :(得分: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 :(得分:1)

// we need to mock the service so that we can control the values emited by the observable let newValues = Subjects(); let mockService = { getLoginAndAccountsList$: () => newValues.asObservable() } TestBed.configureTestingModule({ imports: [ HttpClientTestingModule,], providers: [ {provide: AccountsService, useValue: mockService }], // this is one way of mocking the service declarations: [ HomeComponent] }).compileComponents(); // in the test const spy = spyOn(comp, 'handleNewValues'); comp.ngOnDestroy(); // cancels the subscription newValues.next('test'); expect(spy).not.toHaveBeenCalled(); 方法不是用于 action 查询的,而是用于 select 查询的。

答案 2 :(得分:1)

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