Когда я использую приведенный ниже код для подключения к базе данных доступа из Excel, я получаю сообщение об ошибке 3704 «Операция не допускается, когда объект закрыт». в строкеИспользование ADO для подключения к базе данных Access из Excel Ошибка 3704
Call .Offset(1, 0).CopyFromRecordset(rstRecordSet)
Я могу «исправить» эту проблему, закомментировать строку
adoConnection.Close
, но я действительно не нравится это, или понять, почему он решает эту проблему.
Может кто-нибудь объяснить, что случилось, и как это исправить?
Благодаря
Private Const constStrDBPath As String = "H:\Projects\DP.mdb"
Private Const constStrConnection As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & constStrDBPath & ";" & _
"Jet OLEDB:Engine Type=5;" & _
"Persist Security Info=False;"
Public Function SelectStatement(strCommandText As String) As Object
Dim adoConnection As New ADODB.Connection
Dim adoCommand As New ADODB.Command
Dim rstRecordSet As New ADODB.Recordset
adoCommand.CommandText = strCommandText
adoConnection.Open constStrConnection
adoCommand.ActiveConnection = adoConnection
'create the recordset by executing command string
Set rstRecordSet = adoCommand.Execute(, , adadoCommandText)
Set SelectStatement = rstRecordSet
' clean up
adoConnection.Close
Set rstRecordSet = Nothing
Set adoConnection = Nothing
Set adoCommand = Nothing
End Function
Sub TestSelect()
Dim rstRecordSet As Object
Dim lngField As Long
Set rstRecordSet = SelectStatement("SELECT * FROM tblSystem")
If Not rstRecordSet Is Nothing Then
With Sheet1.Range("A1")
For lngField = 1 To rstRecordSet.Fields.Count
.Cells(1, lngField).Value = rstRecordSet.Fields(lngField - 1).Name
Next lngField
Call .Offset(1, 0).CopyFromRecordset(rstRecordSet)
End With
End If
End Sub
Предполагая, что у вас есть клиентский курсор, я думаю, вам просто нужно установить ActiveConnection набора записей в Nothing, пока вы не закроете соединение. – JosieP