Нужна помощь в ADO (VBA Access):
В Access использованы связанные таблицы и запросы к серверу (MySQL), которые используют один и тот же источник данных ODBC. (MyODBC). При первом обращении к любому из этих запросов или таблиц высвечивается окно аутентификации MyODBC.
В дальнейшем, для остальных таблиц и запросов Access использует уже открытое соединение, не требуя ввода параметров ODBC-подключения.
Вопрос: Как будут выглядеть (на VBA) строки ADO-подключения, чтобы использовалось уже открытое соединение?
Как альтернативный вариант вопроса: Как используя ADO открыть ODBC-соединение, чтобы существествующие связанные таблицы и запросы к серверу использовали это соединение (без повторной аутентификации ODBC). Все обращения к внешнему серверу - связанные таблицы, запросы к серверу, ADO использовуют один и тот же источник данных ODBC.
PS: DAO также подходит.
Заранее благодарю всех откликнувшихся!
VBA Access + ADO: Как использовать уже открытое соединение?
Модератор: Naeel Maqsudov
- 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
DAO совершенно аналогично, только подключаем другую библиотеку и в строке Dim вместо имя типа начинаем с DAO, ставим точку, и из выпадающего списка выбираем "Connection". В справке по VBA все есть.
Спасибо огромное - все ясно и в точку!
каждом компе, где файл будет открываться?
Параллельно возник вопрос - библиотеку ADO при редактировании проекта нужно подключать или наТолько не забудьте подключить к проекту библиотеку ADO нужной Вам версии
каждом компе, где файл будет открываться?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Библиотека подключается к проекту. Подключать на каждом не надо.
На другом компе этот проект не сможет корректно работать, если библиотека АДО выбранной версии там не установлена.
Макросы будут вываливаться на явных операторах SET, создающих объекты из этой библиотеки или на неявных операторах SET.
PS
В приведенном выше примере Conn.Open... - это неявный оператора SET (экземпляр класса создается в момент первого к нему обращения. Это возможно, когда в Dim указан New).
На другом компе этот проект не сможет корректно работать, если библиотека АДО выбранной версии там не установлена.
Макросы будут вываливаться на явных операторах SET, создающих объекты из этой библиотеки или на неявных операторах SET.
PS
В приведенном выше примере Conn.Open... - это неявный оператора SET (экземпляр класса создается в момент первого к нему обращения. Это возможно, когда в Dim указан New).
И все же это не то что нужно, т.к. открывается такое же соединение, но не используется уже открытое.Код: Выделить всё
... Dim Conn As New ADODB.Connection ... Conn.Open "Строка подключения", "Имя", "Пароль" ...
Почему это не подходит? - В запросах к серверу необходимо использовать переменные MySQL-сервера, а они действуют только в пределах одного соединения. Даже если существует другое идентичное соединение, переменные этих двух соединений взаимно не доступны.
В то же время, связанные таблицы и запросы к серверу, связь с сервером которых, настроена на основе одного и того же источника данных ODBC, используют одно и то же соединение, и все работает правильно.
Либо связанные таблицы или запросы к серверу "руками" к формам придется подвязывать через RecordSet-ы, тогда (в моем случае) Access, как инструмент быстрой визуальной разработки модели Web-интерфейса, теряет смысл - сразу на PHP можно все писать.[/quote]
Кажется нашел в чем дело - нужно использовать группировку соединений (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 перестает коннектиться).
Для 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
- Контактная информация:
Уже открытое соединение - это значение переменной Conn. Передайте его в другую процедуру и пусть она пользуется этим соединением.И все же это не то что нужно, т.к. открывается такое же соединение, но не используется уже открытое.
Почему это не подходит? - В запросах к серверу необходимо использовать переменные MySQL-сервера, а они действуют только в пределах одного соединения. Даже если существует другое идентичное соединение, переменные этих двух соединений взаимно не доступны.
В то же время, связанные таблицы и запросы к серверу, связь с сервером которых, настроена на основе одного и того же источника данных ODBC, используют одно и то же соединение, и все работает правильно.
По поводу ODBC не понял... Что в самом деле одно соединение?