VBA в Excel подключиться к удаленной БД Oracle InstantClient с
Я пытаюсь использовать Excel (в основном 2003, для большей совместимости с пользователем)для подключения к удаленной БД Oracle. Я хотел бы запустить a .скрипт sql и возвращает набор данных на рабочий лист.
Я нахожусь на 64-битной машине Windows 7. Я не знаю спецификации сервера Oracle DB.
Я хотел бы сохранить это как можно более легким (никаких дополнительных установок файлов на клиентских компьютерах, используйте общие сетевые расположения для необходимых файлов как можно больше)
Итак Далеко:
Я скачал и "установил" InstantClient из Oracle (версии 12.1 и 11.2 для 32-битных и 64-битных версий) в удаленное сетевое расположение.
Я попытался подключиться к Oracle DB с помощью SQL Plus, и это сработало отлично (я попробовал несколько установленных версий InstantClient, чтобы увидеть, будут ли проблемы с совместимостью).
В качестве теста: используя SQL Plus и функцию оболочки в VBA, я смог успешно скрутить данные в отдельный excel файл.
Я попробовал несколько различных форматов строк подключения, используя различные драйверы / провайдеры:
- драйвер={Oracle в instantclient_11_2}
- драйвер={Microsoft ODBC для Oracle}
- провайдер=MSDAORA
- провайдер=MSDAORA.1
- Provider=OraOLEDB.Оракул
Ошибки, Которые Я Получил:
"Run-time error '-2147467259 (80004005)':
[Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_ENV failed
The Oracle(tm) client and networking components were not found. These components are supplied by Oracle Corporation..."
"Run-time error '-2147467259 (80004005)':
[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified"
"Run-time error '3706':
Provider cannot be found. It may not be properly installed"
И несколько других подобных ошибки.
Я добавил сетевое расположение, содержащее файлы instantclient, в переменную среды PATH. Не уверен, какие еще переменные окружающей среды мне нужны или даже если мой текущий является правильным.
Нужно ли мне:
TNS_ADMIN?
ORACLE_HOME?
Вопрос:
Как подключиться к удаленной Oracle DB с помощью VBA, используя файлы instantclient , которые находятся в сетевое (общее) местоположение ?
Какова правильнаяполная строка соединения? (Я использовал формат EZConnect с SQLPlus; являются ли фактические детали соединения одинаковыми? и для уточнения, может ли кто-нибудь опубликовать пример того, как формат EZConnect преобразуется в другой формат(ы)?)
My EZConnect Format: username/[email protected]/mydb
Какой "провайдер" или "драйвер" я должен использовать для этой цели и есть ли какие-либо существенные различия?
- какие переменные среды я требую, чтобы это сработало?
Я нашел много вопросов, которые похожи или связаны, но ни один из них не дал прямого ответа на мой вопрос или не помог мне полностью решить его.
1 ответ:
Закончил редактирование/использование этой функции (которая не(?) использовать драйвер / провайдер: InstantClient но все еще использует файлы):
Function ORAQUERY(strHost As String, strDatabase As String, strSQL As String, strUser As String, strPassword As String) Dim strConOracle, oConOracle, oRsOracle Dim StrResult As String StrResult = "" strConOracle = "Driver={Microsoft ODBC for Oracle}; " & _ "CONNECTSTRING=(DESCRIPTION=" & _ "(ADDRESS=(PROTOCOL=TCP)" & _ "(HOST=" & strHost & ")(PORT=1521))" & _ "(CONNECT_DATA=(SERVICE_NAME=" & strDatabase & "))); uid=" & strUser & " ;pwd=" & strPassword & ";" Set oConOracle = CreateObject("ADODB.Connection") Set oRsOracle = CreateObject("ADODB.Recordset") oConOracle.Open strConOracle Set oRsOracle = oConOracle.Execute(strSQL) MsgBox (oRsOracle.Fields(0).Value) varResult = oRsOracle.GetRows Do While Not oRsOracle.EOF If StrResult <> "" Then StrResult = StrResult & Chr(10) & oRsOracle.Fields(0).Value Else StrResult = oRsOracle.Fields(0).Value End If oRsOracle.MoveNext Loop oConOracle.Close Set oRsOracle = Nothing Set oConOracle = Nothing ORAQUERY = StrResult End Function
Правильная строка полного соединения:Driver={Microsoft ODBC for Oracle}; CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=strHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=strDatabase))); uid=strUser; pwd=strPassword;Поставщик или драйвер:
{Microsoft ODBC для Oracle}Необходимо задать переменную среды PATH, чтобы она указывала на instantclient.
Не использовал другие переменные среды, например ORACLE_HOME, TNS_ADMIN и т. д.
Comments