Попытка установить соединение с QODBC, импортировать таблицу, а затем закрыть соединение

Работа в Access 2007 на VBA:

В основном то, что у меня есть в настоящее время, работает без ошибок, но я, вероятно, нарушаю что-то в коде (возможно, adodb и DAO?), несмотря на то, что я не могу завершить соединение, когда код завершится. Если я удалю код для «импорта», тогда соединение запустится, выполнит любой код, а затем отключится, что я и хочу сделать, но с импортом.

Моя причина для этого заключается в том, что QODBC получает доступ к учетной записи пользователя, которая входит в Quickbooks, а затем извлекает информацию. Проблема в том, что «пользователь» в основном остается в системе, что не очень хорошо, потому что нам нужен доступ к однопользовательскому режиму и тому, что у вас есть. Вот код, который у меня есть до сих пор. Пожалуйста помоги!

Private Sub Connect_Click()
On Error GoTo ErrorHandler
'*****************************************************
'Connects the DB to QODBC, imports, and queries the info
'*****************************************************

Dim msg As String
Dim oConnection
Dim sConnectString
Dim dbs As DAO.Database
Dim lngRowsAffected As Long

'Sets connection string
sConnectString = "DSN=Quickbooks Data;OLE DB Services=-2;"
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Open sConnectString

        Set dbs = CurrentDb

' Import from QODBC
        DoCmd.TransferDatabase acImport, "ODBC Database", "ODBC;DSN=QuickBooks Data;DFQ=C:\Users\Public\Documents\Intuit\QuickBooks\Sample Company Files\QuickBooks 2012\sample_manufacturing business.QBW;SERVER=QODBC;OptimizerDBFolder=%AppData%\QODBC Driver for QuickBooks\Optimizer;OptimizerCurrency=Y;OptimizerAllowDirtyReads=D;OptimizerSyncAfterUpdate=Y;SyncFromOtherTables=N;ForceSDKVersion=<default SDK>;LicenseYear=2018", acTable, "SalesOrder", "SalesOrder1"
'Executes a query that appends a table called 'SalesOrder' from a table called 'SalesOrder1'
        dbs.Execute "qryAppendSalesOrder", dbFailOnError
'Bypasses warning messages through an execution of query but this grabs the total appended
        lngRowsAffected = dbs.RecordsAffected
'Function that logs how many lines were appended. Basically just an activity table
        Globals.Logging "Sales Orders Appended: " & lngRowsAffected
'Updates the 'SalesOrder' from 'SalesOrder1'
        dbs.Execute "qryUpdateSalesOrder", dbFailOnError
'Deletes the 'SalesOrder1' table that was imported
        DoCmd.DeleteObject acTable, "SalesOrder1"
        lngRowsAffected = dbs.RecordsAffected


'Closes Connection
oConnection.Close
Set oConnection = Nothing

ErrorHandler:
    If Err.Number <> 0 Then
        msg = "Error # " & Str(Err.Number) & " was generated by " _
        & Err.Source & Chr(13) & "Error Lne: " & Erl & Chr(13) & Err.Description
        MsgBox msg, , "Error", Err.HelpFile, Err.HelpContext
    End If

End Sub

person Colton Mayers    schedule 07.09.2017    source источник
comment
Так работает или нет? В чем заключается конкретная проблема и нет ли способа воспроизвести ее с помощью минимально воспроизводимого примера?   -  person Mathieu Guindon    schedule 07.09.2017
comment
Я предполагаю, что конкретная проблема заключается в том, что мне нужно установить соединение, импортировать таблицу из этого соединения, а затем закрыть это соединение. Прямо сейчас он откроет соединение и выполнит весь код без ошибок, но не закроет соединение с источником ODBC. Однако, если я полностью удалю импортную часть кода. Соединение откроется, выполните любой код внутри, а затем успешно закройте соединение. Я считаю, что импорт вызывает собственное соединение?   -  person Colton Mayers    schedule 07.09.2017
comment
Для чего еще ему нужна строка подключения?   -  person Mathieu Guindon    schedule 07.09.2017
comment
Я полагаю, нет другой причины, кроме как вызвать соединение. Как вы думаете, я мог бы как-то сослаться на соединение, которое открывается в начале кода? Или будет ли способ закрыть соединение через некоторое время после импорта?   -  person Colton Mayers    schedule 07.09.2017
comment
Зачем вообще нужен oConnection? Вы открываете его, а затем закрываете - он никогда не используется. Избавиться от этого. Или посмотрите, может ли TransferDatabase принимать объект ADODB.Connection вместо строки подключения (сомнительно).   -  person Mathieu Guindon    schedule 07.09.2017
comment
Если импорт отсутствует, то работает oConnection. Я не совсем уверен, как закрыть соединение после импорта? На самом деле мне все равно, как он вызывает соединение, но я понятия не имею, как заставить его закрыть это соединение. Это ключ   -  person Colton Mayers    schedule 07.09.2017


Ответы (1)


oConnection.Open — открыто 1-е соединение с QuickBooks Data.

DoCmd.TransferDatabase — 2-е соединение открыто для данных QuickBooks.

oConnection.Close — 1-е соединение закрыто

Когда вы используете DoCmd, MS Access откроет соединение с DSN=QuickBooks Data и не закроет его, пока вы не закроете приложение MS Access.

Существует активное подключение к QODBC DSN и QuickBooks, поэтому вы не можете закрыть приложение QuickBooks.

Возможно, вам придется закрыть приложение MS Access, чтобы разорвать соединение. Закрыть соединение ODBC DSN вручную

Или Найдите способ закрыть соединение, открытое через DoCmd [DoCmd.Close() - не закрывает соединение]

Или используйте oConnection для передачи данных из таблиц QODBC в таблицы MS Access. Прочитайте каждую строку и добавьте ее в таблицу MS Access.

Для получения дополнительной помощи создайте заявку в службу поддержки или выполните поиск по этой проблеме на странице нашей системы поддержки:

http://support.qodbc.com

person Rajendra Dewani    schedule 13.09.2017