【发布时间】:2019-06-24 19:04:24
【问题描述】:
我们有几个使用 ADODB 连接到 oracle 数据库的 excel 电子表格(请参见下面的示例代码)。连接是使用 TNSNAMES 建立的,该 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 连接字符串,或者我是否需要完全使用其他东西。如果有人能指出我正确的方向,将不胜感激。
编辑
只是为了提供更多关于我的设置的背景信息。 32 oracle 客户端安装在我们的网络驱动器 (z:\oracle11) 上。使用它的客户端机器在此处的注册表中有驱动程序信息:
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;
根据 cmets 和答案以及一些进一步的研究,使用下面的代码设置连接字符串应该可以工作。我必须在连接字符串中包含驱动程序
我使用当前的 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 Data Objects 2.8”库和 6.1 版本,两者都没有任何区别。
回答
为了澄清 Wernfried Domscheit 的答案,您只需更改“DBQ=DATABASE_NAME”,这样 DATABASE_NAME 值就是您的 DNS 值。非常感谢温弗里德。
我显然是想多虑了。我确信我必须先尝试过,但显然不是。干得好,我又试了一次,并再次阅读了答案。
【问题讨论】:
-
我确实查看了连接字符串,但没有任何特定于 LDAP 的内容。我会根据 Wernfried Domscheit 的回答再看看这个。
-
您是否引用了“Microsoft ActiveX 数据对象 x.x 库”?
-
是的,我在库的参考中设置了 2.8。