Excel 使用 VBA 连接到 Oracle 12c

Excel Connect to Oracle 12c Using VBA

尝试使用 Excel VBA 连接到 Oracle Database 12c 企业版 64 位。

客户端计算机安装了以下 32 位驱动程序:

并安装了以下 64 位驱动程序:

该文件具有以下引用:

我尝试了多种格式的连接字符串,但没有任何效果。

'This gave the error "[Oracle][ODBC][Ora]ORA-12560: TNS:protocol adapter error"
cs = "Driver={Oracle in OraClient12Home1}; UID=myuid; PWD=mypwd; SERVER=myhostname/myservicename;"

'This gave the error "[Oracle][ODBC][Ora]ORA-12154: TNS:could not resolve the connect identifier specified"
cs = "Driver={Oracle in OraClient12Home1}; UID=myuid; PWD=mypwd; SERVER=myhostname; DBQ=myservicename;"

'This gave the error "[Oracle][ODBC][Ora]ORA-12560: TNS:protocol adapter error"
cs = "Driver={Oracle in OraClient12Home1}; CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhostname)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=myservicename)));UID=myuid; PWD=mypwd;"

'This would crash Excel
cs = "Driver={Oracle in OraClient11g_home1}; CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhostname)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=myservicename)));UID=myuid; PWD=mypwd;"

我还尝试了在连接字符串中使用以下驱动程序的变体

我认为安装多个版本的 Oracle Client 是个坏主意,即一个 32 位和一个 64 位。

对于 OLE DB(即 "OraOLEDB.Oracle"),由于 COM 的限制,它甚至不可能有多个版本(除非您注册DLL 每次在你 运行 一个应用程序之前)。

一般来说,您可以使用 ODBC 或 OLE DB,两者都应该可以。

最重要的一点是:您的Excel的架构(即32位或64位)必须与您的Oracle驱动程序的架构相同!数据库的体系结构无关紧要。

ODBC 和 OLE DB 驱动程序由 Microsoft("Microsoft ODBC for Oracle" 和 "MSDAO")和 Oracle(例如 "Oracle in OraClient12Home1" 和 "OraOLEDB.Oracle")提供

Microsoft 驱动程序已过时且已弃用,您应该更喜欢 Oracle 的驱动程序。 Microsoft 驱动程序仅适用于 32 位,因此如果您的 Excel 是 64 位,那么您甚至不得不使用 Oracle 驱动程序。

另外请注意,Oracle 驱动程序(ODBC 和 OLE DB)的版本必须与您的 Oracle 客户端的版本相同,很可能是您在安装三个不同的 Oracle 客户端时搞砸了。

如果您需要安装 32 位和 64 位客户端,请按照以下说明操作:BadImageFormatException. This will occur when running in 64 bit mode with the 32 bit Oracle client components installed

感谢大家的帮助,很抱歉延迟回复(有多项工作相关 "fires" 我正在发布)。

无论如何...我找到了适合我的解决方案。我不认为问题是在同一台机器上有多个驱动程序,因为我现在可以连接而不用改变任何东西,除了我使用的连接字符串方法。

虽然我仍然不确定为什么我的连接字符串的 "driver" 方法不起作用,但我能够使用基于 "provider" 的连接字符串并且它起作用了。

'Using OraOLEDB.Oracle.1.
cs = "Provider=OraOLEDB.Oracle.1;User ID=myuid;Password=mypwd;Data Source=myhostname/myservicename;"

'Using OraOLEDB.Oracle.
cs = "Provider=OraOLEDB.Oracle;User ID=myuid;Password=mypwd;Data Source=myhostname/myservicename;"

'Using OraOLEDB.Oracle as a TNS-less connection string.
cs = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myhostname)(PORT=myport)))(CONNECT_DATA=(SERVICE_NAME=myservicename)(SERVER=DEDICATED)));User Id=myuid;Password=mypwd;"

'Using variation of the above with a port included.
cs = "Provider=OraOLEDB.Oracle.1;User ID=myuid;Password=mypwd;Data Source=myhostname:myport/myservicename;"