我正在尝试使用Excel(主要是2003,以获得更多用户兼容性)来连接到远程Oracle DB。我想运行一个.sql脚本并将数据集返回到工作表
我在Windows 7 64位机器上。我不知道Oracle DB服务器的规格
我希望尽可能保持轻量级(在客户端计算机上不安装额外的文件,尽可能使用共享网络位置来获取所需文件)
我将来自Oracle的InstantClient(32位和64位版本12.1和11.2)下载并“安装”到远程网络位置。
我尝试使用SQL Plus连接到Oracle数据库并且工作正常(我尝试了几个已安装的InstantClient版本以查看是否存在任何兼容性问题)。
作为测试:在VBA中使用SQL Plus和Shell函数,我能够成功将数据假脱机到一个单独的excel文件中。
我使用各种驱动程序/提供程序尝试了几种不同的连接字符串格式:
我收到的错误:
"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?
如何使用位于网络(共享)位置<的 instantclient 文件,使用VBA连接远程Oracle DB / EM>?
正确的完整连接字符串是什么? (我在SQLPlus中使用了EZConnect格式;实际的连接细节是否相同?为了澄清,有人可以发布一个EZConnect格式如何转换为其他格式的示例吗?)
My EZConnect Format: username/password@myserver.some.thing.com/mydb
我为此目的使用
我发现了许多类似或相关的问题,但没有一个直接回答我的问题,也没有帮助我完全解决问题。
答案 0 :(得分:3)
结束编辑/使用此功能(不使用(?)使用驱动程序/提供程序: 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 for Oracle}
需要将PATH环境变量设置为指向instantclient 没有使用任何其他环境变量,例如ORACLE_HOME,TNS_ADMIN等