VBA Access + ADO: Как использовать уже открытое соединение?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
yu
Сообщения: 7
Зарегистрирован: 22 июн 2005, 17:59
Откуда: Днепропетровск
Контактная информация:

Нужна помощь в ADO (VBA Access):

В Access использованы связанные таблицы и запросы к серверу (MySQL), которые используют один и тот же источник данных ODBC. (MyODBC). При первом обращении к любому из этих запросов или таблиц высвечивается окно аутентификации MyODBC.
В дальнейшем, для остальных таблиц и запросов Access использует уже открытое соединение, не требуя ввода параметров ODBC-подключения.

Вопрос: Как будут выглядеть (на VBA) строки ADO-подключения, чтобы использовалось уже открытое соединение?

Как альтернативный вариант вопроса: Как используя ADO открыть ODBC-соединение, чтобы существествующие связанные таблицы и запросы к серверу использовали это соединение (без повторной аутентификации ODBC). Все обращения к внешнему серверу - связанные таблицы, запросы к серверу, ADO использовуют один и тот же источник данных ODBC.

PS: DAO также подходит.

Заранее благодарю всех откликнувшихся!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Код: Выделить всё

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 все есть.
yu
Сообщения: 7
Зарегистрирован: 22 июн 2005, 17:59
Откуда: Днепропетровск
Контактная информация:

Спасибо огромное - все ясно и в точку!
Только не забудьте подключить к проекту библиотеку ADO нужной Вам версии
Параллельно возник вопрос - библиотеку ADO при редактировании проекта нужно подключать или на
каждом компе, где файл будет открываться?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Библиотека подключается к проекту. Подключать на каждом не надо.
На другом компе этот проект не сможет корректно работать, если библиотека АДО выбранной версии там не установлена.

Макросы будут вываливаться на явных операторах SET, создающих объекты из этой библиотеки или на неявных операторах SET.

PS
В приведенном выше примере Conn.Open... - это неявный оператора SET (экземпляр класса создается в момент первого к нему обращения. Это возможно, когда в Dim указан New).
yu
Сообщения: 7
Зарегистрирован: 22 июн 2005, 17:59
Откуда: Днепропетровск
Контактная информация:

Код: Выделить всё

...
Dim Conn As New ADODB.Connection
...
Conn.Open "Строка подключения", "Имя", "Пароль" 
...

И все же это не то что нужно, т.к. открывается такое же соединение, но не используется уже открытое.
Почему это не подходит? - В запросах к серверу необходимо использовать переменные MySQL-сервера, а они действуют только в пределах одного соединения. Даже если существует другое идентичное соединение, переменные этих двух соединений взаимно не доступны.
В то же время, связанные таблицы и запросы к серверу, связь с сервером которых, настроена на основе одного и того же источника данных ODBC, используют одно и то же соединение, и все работает правильно.
Либо связанные таблицы или запросы к серверу "руками" к формам придется подвязывать через RecordSet-ы, тогда (в моем случае) Access, как инструмент быстрой визуальной разработки модели Web-интерфейса, теряет смысл - сразу на PHP можно все писать.[/quote]
yu
Сообщения: 7
Зарегистрирован: 22 июн 2005, 17:59
Откуда: Днепропетровск
Контактная информация:

Кажется нашел в чем дело - нужно использовать группировку соединений (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 перестает коннектиться).
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

И все же это не то что нужно, т.к. открывается такое же соединение, но не используется уже открытое.
Почему это не подходит? - В запросах к серверу необходимо использовать переменные MySQL-сервера, а они действуют только в пределах одного соединения. Даже если существует другое идентичное соединение, переменные этих двух соединений взаимно не доступны.
В то же время, связанные таблицы и запросы к серверу, связь с сервером которых, настроена на основе одного и того же источника данных ODBC, используют одно и то же соединение, и все работает правильно.
Уже открытое соединение - это значение переменной Conn. Передайте его в другую процедуру и пусть она пользуется этим соединением.

По поводу ODBC не понял... Что в самом деле одно соединение?
Ответить