使用excel VBA 64位(DSN Less和tnsnames)的ODBC(非OLEDB)的Oracle 11g ado连接字符串

时间:2016-02-11 13:19:10

标签: excel oracle vba oracle11g adodb

请帮忙。我研究了几个小时。我得到了一些工作但没有其他部分。

我要做的是编写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名称时,我的连接工作正常。

任何建议都将不胜感激

由于

3 个答案:

答案 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文档中提到的所有配置步骤都需要它:

  1. Connecting to DataSource
  2. Configuring theDataSource
  3. Oracle ODBC Driver Configuration Dialog Box
  4. 同样在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 improvementssupport 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;