2013-12-19 1 views
1

Когда я использую приведенный ниже код для подключения к базе данных доступа из 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 
+0

Предполагая, что у вас есть клиентский курсор, я думаю, вам просто нужно установить ActiveConnection набора записей в Nothing, пока вы не закроете соединение. – JosieP

ответ

2

Ваша функция SelectStatement не Fetching (чтение) ничего из базы данных.

В простых выражениях ваш фактический SelectStatement() открывает канал с Access, подготавливает запрос, устанавливает курсор и затем выбрасывает все.

Этап очистки должен быть отложен после прочтения последнего набора записей.

+0

Я неправильно понял, как работает объект recordset. Оба ответа указали мне в правильном направлении, и я думаю, что с некоторой работой я доберусь сейчас. Благодарю. –