Страница 1 из 1
VBA Access + ADO: Как использовать уже открытое соединение?
Добавлено: 24 июн 2005, 16:11
yu
Нужна помощь в ADO (VBA Access):
В Access использованы связанные таблицы и запросы к серверу (MySQL), которые используют один и тот же источник данных ODBC. (MyODBC). При первом обращении к любому из этих запросов или таблиц высвечивается окно аутентификации MyODBC.
В дальнейшем, для остальных таблиц и запросов Access использует уже открытое соединение, не требуя ввода параметров ODBC-подключения.
Вопрос: Как будут выглядеть (на VBA) строки ADO-подключения, чтобы использовалось уже открытое соединение?
Как альтернативный вариант вопроса: Как используя ADO открыть ODBC-соединение, чтобы существествующие связанные таблицы и запросы к серверу использовали это соединение (без повторной аутентификации ODBC). Все обращения к внешнему серверу - связанные таблицы, запросы к серверу, ADO использовуют один и тот же источник данных ODBC.
PS: DAO также подходит.
Заранее благодарю всех откликнувшихся!
Добавлено: 24 июн 2005, 16:44
Naeel Maqsudov
Код: Выделить всё
Dim Conn As New ADODB.Connection
Sub qwe()
Dim Table As ADODB.Recordset
If IsObject(Conn) Then
Conn.Open "Строка подключения", "Имя", "Пароль"
End If
Set Table = Conn.Execute("select чего-нибудь")
.........
End Sub
Только не забудьте подключить к проекту библиотеку ADO нужной Вам версии (в VBА меню Tools/References).
DAO совершенно аналогично, только подключаем другую библиотеку и в строке Dim вместо имя типа начинаем с DAO, ставим точку, и из выпадающего списка выбираем "Connection". В справке по VBA все есть.
Добавлено: 24 июн 2005, 19:01
yu
Спасибо огромное - все ясно и в точку!
Только не забудьте подключить к проекту библиотеку ADO нужной Вам версии
Параллельно возник вопрос - библиотеку ADO при редактировании проекта нужно подключать или на
каждом компе, где файл будет открываться?
Добавлено: 25 июн 2005, 09:59
Naeel Maqsudov
Библиотека подключается к проекту. Подключать на каждом не надо.
На другом компе этот проект не сможет корректно работать, если библиотека АДО выбранной версии там не установлена.
Макросы будут вываливаться на явных операторах SET, создающих объекты из этой библиотеки или на неявных операторах SET.
PS
В приведенном выше примере Conn.Open... - это неявный оператора SET (экземпляр класса создается в момент первого к нему обращения. Это возможно, когда в Dim указан New).
ADO подключение
Добавлено: 25 июн 2005, 19:53
yu
Код: Выделить всё
...
Dim Conn As New ADODB.Connection
...
Conn.Open "Строка подключения", "Имя", "Пароль"
...
И все же это не то что нужно, т.к. открывается такое же соединение, но не используется уже открытое.
Почему это не подходит? - В запросах к серверу необходимо использовать переменные MySQL-сервера, а они действуют только в пределах одного соединения. Даже если существует другое идентичное соединение, переменные этих двух соединений взаимно не доступны.
В то же время, связанные таблицы и запросы к серверу, связь с сервером которых, настроена на основе одного и того же источника данных ODBC, используют одно и то же соединение, и все работает правильно.
Либо связанные таблицы или запросы к серверу "руками" к формам придется подвязывать через RecordSet-ы, тогда (в моем случае) Access, как инструмент быстрой визуальной разработки модели Web-интерфейса, теряет смысл - сразу на PHP можно все писать.[/quote]
ADO - как заставить работать через одно соединенение
Добавлено: 29 июн 2005, 13:40
yu
Кажется нашел в чем дело - нужно использовать группировку соединений (Connection Pooling) (
http://support.microsoft.com/kb/237844/EN-US/ ) - когда ее включаю, все запросы пытаются использовать одно и то же соединение, только
еще одна проблема вылезла:
Для ADO-содениения строку подключения DSN по умолчанию прописал, данные пользователя (UID и PWD), а также данные сервера (SERVER и PORT) получию из формы на входе и подставляю в строку соединения. Всю строку подключения предъявил в ADO. - Соединение установлено.
"Запросы к серверу" также пытаются использовать это соедиенение, но используют вместро полной строки подключения из ADO свою прописанную по умолчанию без UID и PWD. При этом вылазит ошибка подключения ODBC. Хотя если одному из "запросов к серверу" или "связанных таблиц" предъявить UID и PWD, то остальные их начинают использовать.
Полностью строку подключения по умолчанию не пропишешь, т.к. система многопользовательская, и пользователи прописываются на SQL-сервере.
Вопрос: как заставить "запросы к серверу" использовать полную строку строку подключения с полученными в начале работы программы UID, PWD, SERVER и PORT вместо строки подключения по умолчанию, указанной в свойствах "запроса к серверу"?
Или альтернативный вопрос: Если брать DAO, то "запросы к серверу" и "связанные таблицы" успешно берут строку подключения, которая использовалась для установки DAO-соединения. Есть ли способ заставить DAO использовать "групповые соединения". (Когда я пытаюсь включить Connection Pooling через реестр или через строку подключения - эта опция игнорируется, а когда применяю ту же процедуру, что и для ADO, - ODBC перестает коннектиться).
Добавлено: 20 июл 2005, 20:12
Naeel Maqsudov
И все же это не то что нужно, т.к. открывается такое же соединение, но не используется уже открытое.
Почему это не подходит? - В запросах к серверу необходимо использовать переменные MySQL-сервера, а они действуют только в пределах одного соединения. Даже если существует другое идентичное соединение, переменные этих двух соединений взаимно не доступны.
В то же время, связанные таблицы и запросы к серверу, связь с сервером которых, настроена на основе одного и того же источника данных ODBC, используют одно и то же соединение, и все работает правильно.
Уже открытое соединение - это значение переменной Conn. Передайте его в другую процедуру и пусть она пользуется этим соединением.
По поводу ODBC не понял... Что в самом деле одно соединение?