我们有几个Excel电子表格使用ADODB连接连接到oracle数据库(请参见下面的示例代码)。使用TNSNAMES建立连接,该连接是使用oracle instaclient驱动程序在客户端计算机上设置的。
Set oCN = CreateObject("ADODB.Connection")
oCN.CursorLocation = 3
oCN.CommandTimeout = 0
cCN11 = "DRIVER=Oracle in instantclient11_1;"
strDatabase = "DBQ=DATABASE_NAME;"
strID = "UID=YourID;"
strPassword = "PWD=YourPassword;"
oCN.Open cCN11 & strDatabase & strID & strPassword
此代码可以正常工作。但是,已经决定放弃维护TNSNAMES.ORA来使用LDAP。我试图找到一些有关如何使用LDAP通过VBA连接的信息,但是我找不到任何有用的信息。
我不确定ADODB连接是否允许LDAP连接字符串,或者我是否需要完全使用其他内容。如果有人能指出我正确的方向,将不胜感激。
编辑
只是为我的设置提供更多背景知识。在我们的网络驱动器(z:\ oracle11)上安装了32个oracle客户端。使用此功能的客户端计算机在此处的注册表中具有驱动程序信息:
instantclient11_1中的HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ ODBC \ ODBCINST.INI \ Oracle
“ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ ORACLE”的ORACLE_HOME和TNS_ADMIN设置为指向已安装的oracle客户端(z:\ oracle11)。 TNSNAMES.ORA位于安装文件夹(z:\ oracle11)的根目录中。
此设置已经存在多年了,并且通过TNSNAMES连接时可以正常工作。
连接字符串站点说,如果要进行TNSLESS连接,则连接字符串的格式应为以下格式
SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));
uid = myUsername; pwd = myPassword;
根据评论和答案,并做一些进一步的研究,使用下面的代码设置连接字符串应该可以。我必须在连接字符串中包含驱动程序
我已使用当前的TNSNAMES建立了连接字符串。ORA数据(出于安全原因已删除了HOST,PORT,SERVICE_NAME,UID和PWD)
Dim sSQL As String
Dim oRS As ADODB.Recordset 'ADODB.Recordset
Dim oCN As ADODB.Connection
Set oCN = CreateObject("ADODB.Connection")
oCN.CursorLocation = 3
oCN.CommandTimeout = 0
' Build the connection string
strConnectionString = "DRIVER=Oracle in instantclient11_1;DBQ=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=my_ host)(PORT=1234)))(CONNECT_DATA=(SERVICE_NAME=myhost.world)(SERVER=DEDICATED)));Pwd=my_password;Uid=my_user_id"
' Open the connection using the connection string
oCN.Open strConnectionString
不幸的是,如果TNSNAMES文件中不存在“ DBQ”,我会收到错误消息。
[Oracle][ODBC][Ora][ORA-12154: TNS:could not resolve the connect identifier specified.
如果将DBQ更改为SERVER(如连接字符串示例中所示),则会收到不同的错误消息:
[Oracle][ODBC][Ora][ORA-12560: TNS:protocol adapter error.
我已经针对“ my_host”值执行了NSLOOKUP并得到解决,所以我知道这是正确的。端口号正确。服务名称也正确,用户名和密码也正确。
我也尝试过使用“ Microsoft ActiveX数据对象2.8”库和6.1版本,两者都不起作用。
答案
要弄清楚Wernfried Domscheit的答案,您只需更改“ DBQ = DATABASE_NAME”,以便DATABASE_NAME值为您的DNS值。非常感谢Wernfried。
我显然想过分考虑。我确信我一定先尝试过,但显然没有。干得好,我再次尝试,然后再次阅读答案。
答案 0 :(得分:1)
DATABASE_NAME
只是数据库的别名。通过tnsnames.ora
文件或LDAP服务器解析此类别名没有任何区别。
因此,没有区别。只需像处理TNS_ADMIN
文件那样设置tnsnames.ora
变量即可。