如何在Windows 10中使用64位Excel连接Oracle数据库

时间:2019-04-03 11:45:10

标签: excel vba oracle

我正在尝试使用VBA中的此连接字符串将Excel连接到Oracle:

我在下面收到错误消息:

运行时错误'-2147467259(800004005)': ORA-12154:TNS:无法解析指定的连接标识符

使用: -Excel 2016 64位 -Windows 10 64位 -Oracle Database 12c企业版12.1.0.2.0版-64位 -PL / SQL版本12.1.0.2.0 -核心12.1.0.2.0 -适用于Linux的TNS:版本12.1.0.2.0 -NLSRTL版本12.1.0.2.0

Excel由公司提供64位和oracle,希望可以在不更改excel到32位的情况下解决。任何帮助将不胜感激。我实际上已经尝试解决了两天,根本看不到希望。感谢您的宝贵时间。

不确定我使用的驱动程序是否为32位? 适用于Oracle的Microsoft ODBC,MSORCL32.DLL 在Client_11_Std_x86_1中的Oracle,SQORA32.DLL

Dim cnPubs As ADODB.connection
Set cnPubs = New ADODB.connection
Dim strConn As String
With cnPubs
    strConn = "Provider=OraOLEDB.Oracle;" & _
    "Data Source=" & sSource & ";" & _
    "User ID=" & sAC & ";Password=" & sPW & ";"

    .Open strConn
    .CommandTimeout = 0
End With

1 个答案:

答案 0 :(得分:0)

好像您错过了一些基础知识,让我们解释一下。当您想连接到Oracle数据库时,无论是sqlplus还是VBA或其他任何东西,实际上您都必须这样做:

SELECT c.name AS competition_name,
  c.id AS competition_id
  FROM competition c
  JOIN competition_seasons s ON s.competition_id = c.id
  JOIN competition_rounds r ON r.season_id = s.id
  JOIN league_ranking l ON l.round_id = r.id
  WHERE c.country_id = :country_id
  ORDER BY c.name ASC

但是,没有人愿意或能够记住这么长而复杂的数据库名称。 因此,您宁愿使用别名,即sqlplus MyUserName@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.0)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORA12)))

的快捷方式

有多种方法来定义和解析此类别名(请参见Managing Network Address Information),最常见和最简单的方法是使用本地(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.0)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORA12)))文件。

在您的tnsnames.ora文件中,您可以添加如下一行:

tnsnames.ora

然后,您可以简单地通过以下方式连接到数据库

MY_DB=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.0)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORA12)))

现在,下一个问题是:我的应用程序如何在系统上找到sqlplus MyUserName@MY_DB 文件?答案并不像您想象的那么简单,请参阅Determining location of relevant tnsnames.ora file

最安全的解决方案是:定义环境变量tnsnames.ora,并将TNS_ADMIN文件所在的目录名称作为值。

提供程序“ msdaora”与“ Oracle OLE DB”提供程序使用不同的模式来查找tnsnames.ora文件。 msdaora可以找到您的文件,而Oracle OLE DB找不到。设置环境变量tnsnames.ora使其对两者均有效。