Excel: выполнить процедуру SQL с VBA - разрешить пользователю продолжать работу - не вешать приложение Excel - PullRequest
0 голосов
/ 15 мая 2019

У меня есть несколько способов выполнения хранимой процедуры из Excel VBA. На самом деле, я даже не заинтересован в возврате результатов этой процедуры обратно в Excel, мне просто нужно начать процедуру. Впрочем, когда процедура запущена, Excel «зависает» и потому непригоден для клиента, особенно когда время выполнения процедуры составляет 5 минут и более.

Я смотрел на другие решения, в которых люди создавали новое приложение в одной книге, но не было ясно, как выполнить процедуру в этом контексте. Другим решением было открытие второй книги в фоновом режиме (скрытой для пользователя) и автоматический запуск макроса при открытии этой книги, но мне неясно, когда я знаю, чтобы закрыть ее.

Мой код для вызова процедуры, обратите внимание, это связано с проблемой тайм-аута, любые мысли по этому поводу тоже приветствуются:

Sub Workbook_Open()

 'Create connection string variable
    Dim item As String
    Dim con As New ADODB.Connection

    'Build the connection string
    con.ConnectionString = "Provider=SQLNCLI11;" _
             & "Server=MyServerName;" _
             & "Database=Oracle;" _
             & "Integrated Security=SSPI;"

   'Open the connection
    con.Open

    item = vbNullString

    item = "exec dbo.SP_ORACLE_PULL"
    con.Execute (item)

   'Close the connection   
    con.Close

 End Sub

У кого-нибудь есть рекомендуемые подходы? Лучше всего открыть книгу, скрытую в фоновом режиме, и запустить процедуру оттуда? как узнать, когда закрыть эту книгу и вернуть статус обратно в исходную книгу? Будет ли это все еще «висеть» у клиентов всех открытых книг Excel. Я искал по всему, и я не нашел никаких примеров кода для этого типа сценария.

Это все время, пока мы не сможем формализовать более корпоративное решение за 4-6 месяцев.

1 Ответ

2 голосов
/ 15 мая 2019

ADO поддерживает асинхронные операции, если вы объявляете свое Соединение и т. Д., Используя WithEvents

См. Здесь, например: https://support.microsoft.com/en-us/help/190988/how-to-open-ado-recordsets-asynchronously-using-withevents

...