当前位置: 首页 > 面试题库 >

Excel VBA使用InstantClient连接到远程Oracle DB

何哲
2023-03-14
问题内容

我正在尝试使用Excel(主要是2003,以提高用户兼容性)连接
到远程Oracle DB。我想运行一个.sql脚本并将
数据集返回到工作表。
我在Windows 7 64位计算机上。我不知道Oracle DB
服务器的规格。
我想使它尽可能轻巧(
在客户端计算机上没有额外的文件安装,请尽可能将共享的网络位置用于所需的
文件)

迄今为止:
我从Oracle(
将32位和64位版本分别为12.1和11.2)下载并“安装”了InstantClient,并将其安装到了远程网络位置。
我尝试使用SQL Plus连接到Oracle DB,并且运行良好(我尝试
了几个已安装的InstantClient版本,以查看是否存在任何
兼容性问题)。
作为测试:在VBA中使用SQL Plus和Shell函数,我能够
成功地将数据假脱机到单独的excel文件中。

我使用各种
驱动程序/提供程序尝试了几种不同的连接字符串格式:

  • Driver={Oracle in instantclient_11_2}
  • Driver={Microsoft ODBC for Oracle}
  • Provider=MSDAORA
  • Provider=MSDAORA.1
  • Provider=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文件的网络位置添加到
PATH环境变量中。不知道我还
需要其他哪些环境变量,或者即使我当前的环境变量正确,也不确定。

我需要:
TNS_ADMIN吗?ORACLE_HOME?

Question:

  • 如何使用位于网络(共享)位置的InstantClient文件通过VBA连接到远程Oracle DB?

  • 正确的完整连接字符串是什么?(我将EZConnect格式与SQLPlus一起使用;实际的连接详细信息是否相同?为澄清起见,有人可以举例说明EZConnect格式如何转换为其他格式吗?)

            My EZConnect Format: username/password@myserver.some.thing.com/mydb
    
    • 为此,我应该使用什么“提供者”或“驱动程序” ,并且有什么显着差异?

    • 我需要什么环境变量才能完成这项工作?

我发现了很多相似或相关的问题,但是没有一个问题可以直接回答我的问题或为我提供了足够的解决方案。


问题答案:

最终编辑/使用了此功能(不使用驱动程序/提供程序: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

Correct full Connection String:

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

Provider or Driver:

需要设置PATH环境变量以指向InstantClient。
没有使用任何其他环境变量,例如ORACLE_HOME,
TNS_ADMIN等。



 类似资料:
  • 我正在使用dbeaver连接到远程mongodb服务器,这需要用户名和密码。我可以使用命令连接到它,但使用DBEAVER失败。 我试过所有这些凭据机制,但没有一个奏效。当我使用简单的机制时,它说 DBException:连接到Mongo实例[10.20.88.19]com.MongoDb.MongoMeoutException:MongoMeoutException:等待与ReadPreferen

  • 我知道我可以使用KDE dolphin在远程机器中打开一个目录,我可以通过ssh直接访问该目录,但如果该机器距离我们只有一跳呢?通常,当我必须打开此类机器上的终端(我们称之为目的地)时,我会发出以下命令: 这允许我连接到“中间”服务器。然后,从: 如何使用KDE Dolphin从本地机器在目标中打开文件浏览器?

  • 问题内容: 我正在使用SQL Server 2008 R2和Microsoft Excel。 我已将服务器设置为通过Windows用户 或 数据库用户登录 我 可以 用数据库用户正常登录数据库 我 可以 使用Silverlight应用程序连接到数据库 我 无法 弄清楚如何从Excel中的远程PC连接 我去了Excel->数据->从其他来源->从SQL Server 我的服务器名称是,因此在Exce

  • 问题内容: 我正在尝试使用以下代码从本地计算机virtualhost连接到远程MySQL服务器: 我的问题是我无法本地连接,收到错误消息: 无法连接到“ xxx.xxx.xxx.xxx”上的MySQL服务器(10060) 当我将相同的PHP文件上传到服务器时,情况并非如此。我能够毫无问题地查询数据库。 我也无法通过命令行进行连接,但是我可以访问cPanel,它排除了我的IP被意外禁止的可能性。 我

  • 问题内容: 我想在一台机器上运行一个IPython实例,并通过另一个进程(运行一些python命令)(通过LAN)连接到它。我了解zmq是可能的:http : //ipython.org/ipython- doc/dev/development/ipythonzmq.html 。 但是,我找不到有关如何执行操作以及是否可行的文档。 任何帮助,将不胜感激! 编辑 我希望能够连接到IPython内核实

  • 我已经创建了一个redis集群,它自己是工作的,但我不能连接我的客户到它。 我正在使用redisson连接到它,下面的代码 其中,redisURL是csv,格式为:,但包含集群中的所有6个节点。