从 VBA 到 Oracle 数据库的连接

Connection from VBA to Oracle DB

通过下面的文字设置,我成功连接并从数据库检索数据。有一次,在执行宏时,我的 PC (windows 10) 断电了,从那一刻起,我每次尝试连接到数据库时都会收到错误消息(仅在我尝试通过以下方式连接时) VBA) 带有以下消息:

运行-时间错误“-2147467259 (80004005)”:
[Microsoft][Oracle 的 ODBC 驱动程序][Oracle]尝试检索错误 ORA-01019 的文本时出错


我收到的错误来自命令 "cn.Open (strConnection)"

我安装了 ODAC 12c 32 位因为我有 Excel 32 位。

我认为这个错误由于来自某些寄存器的信息处于活动状态,该信息在 PC 在检索数据时断电后被锁定,但我找不到它。
任何帮助或提示对我来说都是宝贵的。

提前致谢

配置为:

环境变量:
ORACLE_HOME = C:\app\client\xxxx\product.2.0\client_1
PATH = C:\app\client\xxxx\product.2.0\client_1\Network\Admin
PATH = C:\app\client\xxxx\product.2.0\client_1\Network\Admin\ bin

参考 - VBA项目:
Visual Basic for Applications
Microsoft Excel 16.0 Object Library
Microsoft Forms 2.0 对象库
Microsoft ActiveX 数据对象 2.8 库
Microsoft ActiveX 数据对象记录集 2.8 库
Microsoft OLE DB 简单提供程序 1.5 库
OraOLEDB 1.0 类型库

Active Services:
OracleOraClient12Home1_32bitMTSRecoveryService

我尝试卸载Oracle Client并重新安装,但没有成功。我还创建了 ORACLE_HOME 变量并尝试了更多不同的连接字符串变体和包含的引用的组合,但错误仍然相同。

Dim strConneciton As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

strConneciton = "Driver={Microsoft ODBC for Oracle};" & _
"CONNECTSTRING=(DESCRIPTION=" & _
"(ADDRESS=(PROTOCOL=TCP)" & _
"(HOST=xxx.xxxx.xxx)(PORT=1521)" & _
"(CONNECT_DATA=(SERVICE_NAME=xxxxx)));user id=user1;password=1234;")

cn.Open (strConneciton)

If cn.State = adStateOpen Then
 cn.Close
 MsgBox "Completed!"
Else
 MsgBox "Connection failed!"
End If

感谢您的回答。
我将这些位置添加到 PATH 变量中,但问题是一样的。
随着驱动程序的改变(OraClient12Home1_32bit 中的 Oracle -是 ODBC 数据源管理器(32 位)中的正确名称),我收到以下错误:
TNS 协议适配器错误。

我可以从 sqlplus 连接到数据库,但问题是当我尝试通过 VBA 连接时。

@Tim,谢谢你的提示,但这不是这里的问题,我之前已经检查过了。

最后我用新的连接字符串完成了这个,如下所示:

strConnection = "Provider=OraOLEDB.Oracle;Data Source=xxx.xxxx.xxx:1521/xxxxx;User ID=user1;Password=1234;"

再次感谢。

我一直在为同样的连接错误而苦苦挣扎。以下是它对我的作用。

这是我的摘录 tnsnames.ora:

#VISUALTIME7 / EX PRODUCTION
VISUALTIME7_DEV=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XX.XX.XX)(PORT = XXXX))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = VISUALTIME7)
    )
  )

这是我的 vba 代码:

Sub CopyDataFromDatabase()
    Dim Conn As ADODB.Connection
    Set Conn = New ADODB.Connection
    Dim strCon As String
    
    'DataSource argument according to my tnsnames.ora
    strCon = "Provider=OraOLEDB.Oracle;Data Source=VISUALTIME7_DEV;User ID=myUser;Password=myPassword;"
        
    Conn.Open (strCon)
    
    Conn.Close
    
End Sub

我在 vba 项目中的引用:

  • Visual Basic 应用程序
  • 微软 Excel 10.0 对象库
  • OLE 自动化
  • Microsoft Office 16.0 对象库
  • Microsoft ActiveX 数据对象 6.1 库