代码之家  ›  专栏  ›  技术社区  ›  ptownbro

Excel使用VBA连接到Oracle 12c

  •  0
  • ptownbro  · 技术社区  · 6 年前

    尝试使用Excel VBA连接到Oracle数据库12c Enterprise Edition 64位。

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

    • 用于Oracle的Microsoft ODBC
    • oraclient11g_home中的Oracle 1
    • oraclient12home1 bit中的Oracle

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

    • oraclient11g_home中的Oracle 1
    • 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
    • 甲骨文
    • oraclient12home1中的Oracle
    2 回复  |  直到 6 年前
        1
  •  0
  •   Wernfried Domscheit    6 年前

    我认为安装多个版本的Oracle客户端是一个坏主意,即一个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 Oracle12home1”和“oraoleb.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

        2
  •  0
  •   ptownbro    6 年前

    感谢大家的帮助,并为延迟的响应感到抱歉(有多个与工作相关的“火灾”,我正在扑灭)。

    总之…我找到了一个适合我的解决方案。我不认为问题出在同一台机器上有多个驱动程序,因为我现在可以在不改变任何东西的情况下进行连接,除了我使用的连接字符串方法。

    虽然我仍然不知道为什么连接字符串的“驱动程序”方法不起作用,但我能够使用基于“提供者”的连接字符串,而且这种方法也起作用。

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