Excel VBA使用InstantClient连接到远程Oracle数据库

我试图使用Excel(主要是2003,为了更多的用户兼容性)连接到远程Oracle数据库。 我想运行.sql脚本并将数据集返回到工作表。
我在Windows 7 64位机器上。 我不知道Oracle数据库服务器的规格。
我想尽可能保持轻量级(客户端机器上没有额外的文件安装,尽可能使用共享的networking位置来存储所需的文件)



至今:

我从Oracle(32位和64位版本12.1和11.2)下载并“安装”InstantClient到远程networking位置。
我尝试使用SQL Plus连接到Oracle数据库,它工作正常(我试了几个安装的InstantClient版本,看看是否会有任何兼容性问题)。
作为一个testing:在VBA中使用SQL Plus和Shell函数,我能够成功地将数据caching到一个单独的excel文件中。


我尝试了几种不同的连接string格式,使用各种驱动程序/

  • Driver = {instantclient_11_2中的Oracle}
  • Driver = {Microsoft ODBC for Oracle}
  • 供应商= MSDAORA
  • 供应商= MSDAORA.1
  • 供应商= OraOLEDB.Oracle

收到的错误:

"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文件的networking位置添加到我的PATH环境variables中。 不知道我需要什么其他的环境variables,或者即使我目前的环境variables是正确的。

我需要:
TNS_ADMIN? ORACLE_HOME?



题:

  • 如何使用位于networking(共享)位置即时客户端文件,通过VBA连接到远程Oracle数据库

    • 什么是正确的完整连接string? (我用SQLPlus的EZConnect格式;实际的连接细节是否一样?为了澄清,有人可以发表一个EZConnect格式如何转换为其他格式的例子?)

       My EZConnect Format: username/password@myserver.some.thing.com/mydb 
    • 应该使用什么“提供者”或“驱动程序” 达到这个目的?有什么重大的区别?

    • 需要做什么环境variables来完成这项工作?

我发现了很多类似或相关的问题,但没有一个直接回答我的问题,或者帮助我完全解决问题。

结束编辑/使用此function(不(?)使用驱动程序/提供者: 即时客户端,但仍然使用这些文件):

 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 

正确的完整连接string:

 Driver={Microsoft ODBC for Oracle}; CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=strHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=strDatabase))); uid=strUser; pwd=strPassword; 

供应商或驱动程序
{用于Oracle的Microsoft ODBC}

需要设置PATH环境variables指向instantclient。
没有使用任何其他的环境variables,例如ORACLE_HOME,TNS_ADMIN等