Как сделать постоянным ADODB.Connection в VBA в Excel? - PullRequest
3 голосов
/ 10 июля 2011

У меня есть таблица Excel, которая должна отображать данные из нашей базы данных SQL.

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

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Daz Lewis совершенно прав, что вы не должны держать соединения с базой данных открытыми бесконечно. Однако, , если это локальная база данных, и вы используете ее только , тогда вы сможете держать ее открытой, сколько пожелаете.

Добавьте это как верхнюю строку модуля, содержащего ваш код:

Global dbConnPublic As ADODB.Connection

В объекте "ThisWorkbook":

Private Sub Workbook_Open()
    Set dbConnPublic = openDBConn() 'Or whatever your DB connection function is called'
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    dbConnPublic.Close
End Sub

Это откроет соединение БД при открытии рабочей книги и закроет его при закрытии рабочей книги. Имейте в виду, что вы можете захотеть убедиться, что соединение все еще открыто, когда вам нужно его использовать, поскольку оно может быть закрыто сервером, если оно открыто слишком долго.

3 голосов
/ 10 июля 2011

Ваше соединение выходит из области видимости после завершения макроса и, следовательно, закрывается.Вы не хотите, чтобы соединения с SQL Server оставались открытыми неопределенно долго, поскольку это может серьезно повлиять на производительность базы данных для других пользователей / служб.

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

...