【问题标题】:VBA - ADODB connect to remote Oracle dbVBA - ADODB 连接到远程 Oracle 数据库
【发布时间】:2017-12-10 02:15:07
【问题描述】:

我正在开发一个 Excel VBA 程序,我想连接到远程 Oracle 11g 数据库、运行查询并将数据返回到 Excel。

据我所知,连接字符串和驱动程序都可以。 (见下文)

昨天它工作了一段时间,连接到数据库并返回正确的数据。然后我保存并关闭了工作簿,20 分钟后打开它(没有进行任何更改!),当我运行宏时出现以下错误:

运行时错误“-2147418113 (8000ffff)”:灾难性故障

任何想法可能导致错误? 可能是数据库方面的东西吗?

谢谢

Sub ExtractFromOracle(environment As String)

Dim cn As ADODB.connection
Dim recordSet As ADODB.recordSet
Set cn = CreateObject("ADODB.Connection")
Set recordSet = CreateObject("ADODB.recordset")

Dim SQLQuery As String
SQLQuery = "SELECT User_Id, Prof_Id FROM user_profile ORDER BY User_Id ASC"

Dim returnData As Variant
Dim returnedRowsCount As Integer

Dim connectionString As String
connectionString = ReturnConnectionString(environment)


cn.Open (connectionString) ------------> ERROR OCCURS HERE


Set recordSet = cn.Execute(SQLQuery)
returnData = Application.Transpose(recordSet.GetRows)
returnedRowsCount = UBound(returnData)

If Not SheetExist(environment) Then
CreateTab (environment)
End If

Worksheets(environment).Activate
ActiveSheet.Range("A1:B" & returnedRowsCount) = returnData

Set rs = Nothing
Set cn = Nothing

ConsolidateUsers (environment)


End Sub

连接字符串:

"Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxx)(PORT=xxxx)))(CONNECT_DATA=(SID=xxxxx)(SERVER=DEDICATED)));User Id=xxxxxx;Password=xxxxxxx;"

【问题讨论】:

  • 如果删除这些行会发生什么

标签: excel vba oracle11g adodb


【解决方案1】:

你可以尝试如下访问ADODB吗

Dim strSQL  As String, conStr as String
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset


conStr = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxxx)(PORT=xxxx)))(CONNECT_DATA=(SID=xxxxx)(SERVER=DEDICATED)));User Id=xxxxxx;Password=xxxxxxx;"

Dim SQLQuery As String
SQLQuery = "SELECT User_Id, Prof_Id FROM user_profile ORDER BY User_Id ASC"

cnn.open conStr   
rs.Open SQLQuery, cnn, adOpenStatic, adLockOptimistic, adCmdText

【讨论】:

  • 请将数据库存放的路径放在conStr中,然后关闭数据库重试。谢谢。
  • 请检查修改后的解决方案。谢谢
  • 谢谢。我已经尝试了修改后的解决方案,现在它再次返回以前的错误“运行时错误'-2147418113(8000ffff)':灾难性故障”也许这是数据库设置的问题?我应该联系 DBA 以重新启动 DB 还是以其他方式?
  • 将 OraClient12 和 oraClient11 引用(共 4 个)从 Path 环境变量中取出,并将其替换为对 SysWow64 文件夹的引用,因为 32 位版本的 oraClient11 存储在那里。 (如果这没有帮助。那么它超出了我的范围:(
  • 我会尝试的,如果有效,我会报告并让您知道。谢谢你的帮助!!
【解决方案2】:

我修复了错误,所以我会为任何发现此线程的有相同问题的人更新。

事实证明,“灾难性故障”错误是由于我的 Oracle ODBC 驱动程序 (oraOLEDB.oracle) 以某种方式损坏,我什至无法正确重新安装它,该错误仅发生在我的机器上。

最后,我将系统还原到问题之前的某个时间点,一切都已修复。不是最优雅的解决方案,但它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2012-07-16
    • 2014-06-03
    相关资源
    最近更新 更多