【问题标题】:Is it possible to have a 32 bit ODBC connection on Windows 10 without a tnsnames.ora file?是否可以在没有 tnsnames.ora 文件的情况下在 Windows 10 上建立 32 位 ODBC 连接?
【发布时间】:2020-02-02 06:55:55
【问题描述】:

我有一个 VBA (Excel) 宏,用于连接和查询 Oracle 数据库。在 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 驱动程序?

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

【问题讨论】:

  • 我对您的具体问题没有答案,但是拥有一个 tnsnames 文件确实为您提供了一个很好的抽象层,在您的个人工作簿和您使用的任何数据库之间 - 当您升级/迁移时您只需要修复一个文件的数据库(可以在共享位置 - 不需要在本地 PC 上)
  • 我没想到。我假设我将 tnsnames 文件的环境变量设置为网络位置而不是本地位置?
  • 是的,这是一个很常见的场景并且效果很好 - 如果您需要测试一个新数据库,您可以在更新“主”副本之前将您的 tnsnames 切换到本地数据库以验证它是否正常。
  • 这就是我接下来要做的。谢谢!
  • tnsnames.ora 文件用于为您的数据源提供别名。由于您将完整的(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=xxx))(CONNECT_DATA=(SID=name))) 放入连接字符串中,因此您绕过了 tnsnames.ora 文件,即您并没有使用 tnsnames.ora。

标签: vba oracle odbc instantclient


【解决方案1】:

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

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

【讨论】:

  • Instant Client ODBC 安装的第一步是“安装 Instant Client Basic 或 Basic Light 包,如上所述”。当我手动解压缩文件时,它包含的只是与 ODBC 相关的文件,而不是整个 Instant Client 包。
  • 我尝试完全按照上面的方式格式化连接字符串,在“DBQ=”部分之前使用 Uid 和 Pwd。我收到另一个错误:“ORA-12154 TNS:无法解析指定的连接标识符”。我也按照上面的原始顺序尝试了它,并收到了同样的错误。
  • 也许您必须用花括号括住数据源,{}(如驱动程序名称)
  • 能否用相同的数据源字符串连接sqlplus(或tnsnping)?
【解决方案2】:

我遇到了同样的问题,并得出结论,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 服务名称而非连接描述符的示例;和
  • 几个月我自己的实验,使用不同的驱动程序和不同的 关键字和连接字符串中的值的组合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2018-10-17
    • 1970-01-01
    • 2011-09-13
    • 2019-03-01
    • 2020-05-15
    • 2011-07-22
    • 2013-01-20
    相关资源
    最近更新 更多