1

我有一个连接并查询 Oracle 数据库的 VBA (Excel) 宏。在 Windows 7 下运行,以下连接字符串有效:

Driver={Microsoft ODBC for Oracle}; Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=xxx))(CONNECT_DATA=(SERVICE_NAME=name))); Uid=username;Pwd=password;

我和这个 Excel 模板的其他用户正在转换到带有 32 位 Office 365 的 Windows 10(64 位)。我喜欢这个连接字符串的地方是它不需要单独的 tnsnames.ora 文件,一个我想保留的功能。我也知道 Microsoft 驱动程序已被弃用(无论如何它不能开箱即用),所以现在是时候改变它了。

我安装了以下内容:

  • Oracle Instant Client 12.2(32 位)
  • 适用于 Instant Client 12.2(32 位)的 Oracle ODBC 驱动程序
  • Visual Studio 2019(32 位)(假设 Oracle 驱动程序向前兼容)

我已经证实:

  • PATH 中的第一个值设置为安装 Instant Client 12.2 的目录
  • ORACLE_HOME 设置为同一目录
  • 只有一个 ORACLE_HOME 变量
  • 驱动程序(instantclient_12_2 中的 Oracle)在 32 位 ODBC 管理工具中可见

我尝试了以下连接字符串的各种调整,但没有运气

Driver={Oracle in instantclient_12_2}; Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=xxx))(CONNECT_DATA=(SID=name))); Uid=username;Pwd=password

我试过用“数据源”代替“服务器”,用“SERVICE_NAME”代替“SID”,两者同时使用。我还尝试过 Excel 365 的内部 ODBC 连接中的字符串。我不断收到的错误是:

ORA-12560: TNS: 协议适配器错误

我开始怀疑在 Windows 10 下需要 tnsname.ora 文件。是否可以在不使用 tnsnames.ora 文件或除安装 Oracle 驱动程序之外的任何其他操作的情况下创建 Windows 10 32 位 OBDC 连接用户的机器?

编辑:我创建了一个可远程访问的 tnsnames 文件。当连接字符串使用该文件并且设置了 TNS_ADMIN 环境变量时,它会连接。如果我在 VBA 本身中使用 tnsnames 文件中的确切文本,它不会识别它(TNS 适配器错误)。我将假设我对需要 tnsnames.ora 文件的 Oracle 驱动程序的怀疑是正确的,至少对于 VBA 是这样。

4

2 回答 2

0

有两种 ODBC 驱动程序,一种来自 Microsoft(已弃用),另一种来自 Oracle。连接字符串略有不同。

“Oracle ODBC Drivers for Instant Client”包含 Instant Client,因此无需单独安装。您只会面临不匹配和目录混乱的风险。

于 2019-10-04T06:39:26.033 回答
0

我遇到了同样的问题,并得出的结论是 Oracle ODBC 驱动程序不支持连接描述符语法。它只需要一个 TNS 名称。

此 Oracle 网页提供了有关 Oracle ODBC 驱动程序将在连接字符串中接受的参数的信息:

https://docs.oracle.com/database/121/ADFNS/adfns_odbc.htm?ref=binfind.com/web

它声明 Dbq 参数采用 TNS 服务名称。而已。连接描述符页面上的任何地方都没有提及。此外,页面上的任何地方都没有提到在 Microsoft ODBC for Oracle 驱动程序的连接字符串中使用连接描述符 “Server”和“CONNECTSTRING”参数。

很难“证明是否定的”。但我得出了一个遗憾的结论,即 Oracle ODBC 驱动程序不支持 Oracle 自己的连接描述符语法,基于:

  • Oracle 的文档仅显示了对 TNS 服务名称的支持;和
  • ConnectionStrings.com 仅显示使用 TNS 服务名称的示例,而不是连接描述符;和
  • 我自己的几个月的实验,使用不同的驱动程序和不同的关键字组合以及连接字符串中的值
于 2020-05-01T15:48:49.040 回答