【发布时间】: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