Excel使用VBA连接到Oracle 12c

时间:2019-01-15 08:15:10

标签: excel vba oracle database-connection oracle12c

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

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

  • Oracle的Microsoft ODBC
  • OraClient11g_home1中的Oracle
  • OraClient12Home1_32bit中的Oracle

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

  • OraClient11g_home1中的Oracle
  • OraClient12Home1中的Oracle

该文件具有以下参考:

  • Microsoft ActiveX数据对象6.1库

我尝试了多种格式的连接字符串,但无济于事。

'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的Microsoft ODBC
  • OraOLEDB.Oracle
  • OraClient12Home1中的Oracle

2 个答案:

答案 0 :(得分:0)

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

对于OLE DB(即“ OraOLEDB.Oracle”),由于基于COM的限制,甚至不可能有多个版本(除非您每次都要注册DLL运行应用程序的时间)。

通常,您可以使用ODBC或OLE DB,两者都可以使用。

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

ODBC和OLE DB驱动程序由Microsoft(“ Oracle的Microsoft ODBC”和“ MSDAO”)和Oracle(例如“ OraClient12Home1中的Oracle”和“ 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

答案 1 :(得分:0)

感谢大家的帮助,对于延迟的回复(我扑灭了多次与工作有关的“火灾”)表示抱歉。

无论如何...我找到了对我有用的解决方案。我不认为问题出在同一台计算机上,因为我现在可以进行连接,而无需更改任何设置,除了我使用的连接字符串方法。

尽管我仍然不确定为什么我的连接字符串的“驱动程序”方法不起作用,但是我仍然能够使用基于“提供商”的连接字符串,并且有效。

'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;"