如何使用 LDAP 从 excel VBA 连接到 Oracle 数据库?
How can I connect to an Oracle database from excel VBA using LDAP?
我们有几个 excel 电子表格使用 ADODB 连接连接到 oracle 数据库(参见下面的示例代码)。连接是使用 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)。使用它的客户端计算机在此处的注册表中具有驱动程序信息:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\Oracle 在 instantclient11_1
"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=我的用户名;pwd=我的密码;
根据评论和答案以及一些进一步的研究,使用以下代码设置连接字符串应该可行。我必须在连接字符串中包含驱动程序
我已经使用当前 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
不幸的是,如果 "DBQ" 在 TNSNAMES 文件中不存在,我会收到错误消息。
[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 值。非常感谢 Wernfried。
我显然是想多了。我确定我一定先尝试过,但显然没有。干得好我又试了一次,然后又读了一遍答案……。
DATABASE_NAME
只是您数据库的别名。 tnsnames.ora
文件或 LDAP 服务器解析此类别名没有任何区别。
所以,没有区别。只需像设置 tnsnames.ora
文件一样设置 TNS_ADMIN
变量。
我们有几个 excel 电子表格使用 ADODB 连接连接到 oracle 数据库(参见下面的示例代码)。连接是使用 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)。使用它的客户端计算机在此处的注册表中具有驱动程序信息:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI\Oracle 在 instantclient11_1
"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=我的用户名;pwd=我的密码;
根据评论和答案以及一些进一步的研究,使用以下代码设置连接字符串应该可行。我必须在连接字符串中包含驱动程序
我已经使用当前 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
不幸的是,如果 "DBQ" 在 TNSNAMES 文件中不存在,我会收到错误消息。
[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 值。非常感谢 Wernfried。
我显然是想多了。我确定我一定先尝试过,但显然没有。干得好我又试了一次,然后又读了一遍答案……。
DATABASE_NAME
只是您数据库的别名。 tnsnames.ora
文件或 LDAP 服务器解析此类别名没有任何区别。
所以,没有区别。只需像设置 tnsnames.ora
文件一样设置 TNS_ADMIN
变量。