我正在尝试使用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
答案 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
使其对两者均有效。