请帮忙。我研究了几个小时。我得到了一些工作但没有其他部分。
我要做的是编写excel VBA中的所有连接字符串以连接到Oracle 11g数据库。我不想在ODBC Administrator中设置用户DSN,我也不想维护tnsnames.ora文件。
我可以让它适用于OLEDB连接字符串,但我相信Oracle不再支持它,因此我只想使用Oracle ODBC驱动程序命令。
这是我必须工作的(需要tnsnames.ora文件)
DRIVER={Oracle in OraClient11g_home1};DBQ=MyTNSnamesALias;UID=xxxx;PWD=xxxx
我也尝试了这个但是我收到了TNS协议错误
DRIVER={Oracle in OraClient11g_home1};
Server=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=xxxx)))
(CONNECT_DATA=(SERVICE_NAME=xxx)(SERVER=DEDICATED)));UID=xxxx;PWD=xxxx
其他有用的信息可能是,当我按照ODBC管理员使用DSN名称时,我的连接工作正常。
任何建议都将不胜感激
由于
答案 0 :(得分:1)
仍支持Oracle的OLEDB提供程序(Provider=OraOLEDB.Oracle
),只有Microsoft的提供程序(Provider=msdaora
)为deprecated。 Microsoft建议使用Oracle提供程序。
64位用户甚至不存在Microsoft提供程序msdaora
。
我认为您的Oracle ODBC连接字符串必须是这个(没有换行符):
Driver={Oracle in OraClient11g_home1};
DBQ=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=xxxx)))(CONNECT_DATA=(SERVICE_NAME=xxx)(SERVER=DEDICATED)));
Pwd=xxxx;
Uid=xxxx
注意,对于Oracle驱动程序,您必须使用DBQ
而不是Server
。
Server
是Microsoft ODBC驱动程序的属性(例如Driver={Microsoft ODBC for Oracle}
)
答案 1 :(得分:1)
如果Oracle ODBC driver
文件中没有配置TNS别名,则无法使用tnsnames.ora
进行连接。
Oracle ODBC Driver
文档中提到的所有配置步骤都需要它:
同样在documentation for SQLDriverConnect implementation DBQ
参数中注明,并且在此参数中传递TNS别名的名称只是指定要连接的服务器的方法。
因为它是Oracle ODBC Driver的所有客户端使用的通用API函数,所以其他一些接口(COM对象,配置对话框或其他东西)不可能接受不同的连接参数。
Oracle Objects for OLE也没有这种可能性。
我无法找到取消Oracle Provider for OLEDB
支持的任何内容。
它已作为最新版ODAC的一部分发布:"ODAC 12c Release 4 (12.1.0.2.4)"此版本在Oracle网站的相关部分目前是top news topic 。
最新版本中有some improvements和support for usage from .NET applications。
此外,它起作用(至少对我而言):
Const hostName = "server_host"
Const portNo = "1521"
Const srvSID = "ORASERVERSID"
Const usrID = "login"
Const usrPwd = "password"
Sub con_Oracle_OLEDB()
strDriver = "Provider=OraOLEDB.Oracle;"
strParams = "Data Source=(DESCRIPTION=(CID=MyVbaApp)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + hostName + ")(PORT=" + portNo + ")))(CONNECT_DATA=(SID=" + srvSID + ")));"
strCon = strDriver + strParams + strUser
' Open the above connection string.
Dim con As Object
Set con = CreateObject("ADODB.Connection")
con.ConnectionString = strCon
con.Open
End Sub
基于以上所述,我建议继续使用OLEDB Provider,只需将ODAC更新为latest version。
如果您根本不想使用OLEDB,则有一个Microsoft ODBC驱动程序("Driver={Microsoft ODBC for Oracle};"
)的变体,在CONNECTSTRING
中有详细的服务器参数规范:
Const hostName = "server_host"
Const portNo = "1521"
Const srvSID = "ORASERVERSID"
Const usrID = "login"
Const usrPwd = "password"
Sub con_Microsoft_ODBC_for_Oracle()
strDriver = "Driver={Microsoft ODBC for Oracle};"
strParams = "CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" + hostName + ")(PORT=" + portNo + "))(CONNECT_DATA=(SID=" + srvSID + ")));"
strUser = "UID=" + usrID + ";PWD=" + usrPwd + ";"
strCon = strDriver + strParams + strUser
' Open the above connection string.
Dim con As Object
Set con = CreateObject("ADODB.Connection")
con.ConnectionString = strCon
con.Open
End Sub
当然,这种变体有其自身的缺点。至少,微软方面support cancellation的可能性要大于甲骨文方面的可能性。
答案 2 :(得分:0)
感谢您的回答。我试图使用 64 位的 MSDAORA。 我按照示例使用 OLEDB。除了 oledb 示例不会填充 strUser,但下一个示例会: strUser = "UID=" + usrID + ";PWD=" + usrPwd + ";" 我收到一个无效的用户 ID 密码,但我发送的是正确的密码。这就是我发送的内容(出于安全原因,我用 xxx 替换了密码) Provider=OraOLEDB.Oracle;数据源=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.23.32)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=rmsuat)));Uid= rms;密码=XXX;