我试图在按钮单击事件上打开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
答案 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
语句,因此应使用.Execute
的ADODB Connection object方法而不是.Open
方法。