13212523442 2024-08-13 21:32 采纳率: 75%
浏览 17
已结题

Office版本升级,Oracle连接报错

问题描述:
office2013升级为2016版本,Excel启用宏会报错
错误信息:
1.错误代码:3706,未找到提供程序,该程序可能未正确安装
调试后标黄语句:
Call getRsData.getConn("BASE")
2.错误代码:3709,连接无法用于执行此操作。在此上下文中它可能已被关闭或无效
调试后标黄语句:
Call getRsData.GetRs(strSql)
--
代码如下:
--getRsData 实例
Public getRsData As New pubDBCls
--
'获取数据库连接
Sub getConn(ByVal connType As String)

'判断日期信息是否正确
Dim userPass As Variant
Dim user As String
Dim pass As String
Dim connStr_ORA As String
Dim connStr_BASE As String

'用户
user = ""
'密码
pass = ""

If connType = "ORA" Then
'OLE DB驱动 ,主要适用于调用plsql 中的存在过程 生产
'获取 密码
userPass = Split(get_Db_Password.getDbPassword("annuity"), ",")

'用户
user = userPass(0)
'密码
pass = userPass(1)
connStr_ORA = "Provider=OraOLEDB.Oracle.1;User ID=" & user & ";Password=" & pass & ";Persist Security Info=True;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.89.24.56)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=Annuity)));Extended Properties=PLSQLRSet=1"
conn.Open connStr_ORA
ElseIf connType = "BASE" Then
'OLE DB驱动 ,主要适用于调用plsql 中的存在过程 生产
'获取 密码
userPass = Split(get_Db_Password.getDbPassword("base"), ",")

'用户
user = userPass(0)
'密码
pass = userPass(1)
connStr_BASE = "Provider=OraOLEDB.Oracle.1;User ID=" & user & ";Password=" & pass & ";Persist Security Info=True;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.89.24.54)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=dwprod)));Extended Properties=PLSQLRSet=1"
conn.Open connStr_BASE

ElseIf connType = "EXCEL" Then
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=excel 12.0;;Data Source=" & ThisWorkbook.FullName
End If

If connType <> "EXCEL" Then
'游标类型
conn.CursorLocation = adUseClient
End If

End Sub

'定义公共数据库返回结果集
Sub GetRs(ByVal sql As String)

'声明查询SQL字符
Dim strSql As String

'SQL赋值
strSql = sql

'返回结果游标类型,设置此参数在就能接收后面RS返回的结果集条数
rs.CursorLocation = adUseClient

'打开数据结果集
rs.Open strSql, conn, adOpenKeyset, adOpenStatic

'MsgBox GetRs.RecordCount

End Sub

  • 写回答

24条回答 默认 最新

  • 专家-皆知 2024-08-13 21:32
    关注
    获得0.15元问题酬金

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    遇到您描述的问题,通常是因为Office升级导致之前使用的数据访问组件(特别是旧版本的OLE DB Provider)不再被支持或路径发生了改变。针对您的具体错误信息,这里有几点建议来尝试解决:

    错误代码:3706,未找到提供程序,该程序可能未正确安装

    这通常意味着Office升级后,系统不再能找到指定的数据库提供程序(在这个案例中是OraOLEDB.Oracle.1)。解决方法包括:

    1. 更新Oracle客户端/OLE DB Provider:确保您的Oracle客户端是最新版本,或者至少与新Office版本兼容。您可以从Oracle官方网站下载最新的即时客户端或对应的数据访问组件。

    2. 注册DLL文件:有时升级过程中可能需要手动重新注册Oracle的OLE DB Provider相关的DLL文件。可以通过命令行执行类似以下的命令(请根据实际路径调整):

      regsvr32 "C:\path\to\your\Oracle\instantclient_XX_YY\oraoledb12.dll"
      
    3. 修改连接字符串:考虑替换旧的Provider名称。如果OraOLEDB.Oracle.1不工作了,可以尝试使用较新的Provider名称,例如OraOLEDB.Oracle,或者如果是Oracle Instant Client的话,可能需要不同的命名约定。

    错误代码:3709,连接无法用于执行此操作。在此上下文中它可能已被关闭或无效

    这个错误通常是由于连接管理不当导致的,比如在尝试使用连接或记录集时,它们已经被关闭或无效。确保每次调用数据库操作前后正确地打开和关闭连接及记录集。您的代码已经尝试处理这些情况,但这里是一些优化建议:

    ' 获取数据库连接
    Sub GetConnection(ByVal connType As String) As ADODB.Connection
        Dim conn As New ADODB.Connection
        Dim userPass() As Variant
        Dim user As String, pass As String
        Dim connStr As String
    
        Select Case connType
            Case "ORA", "BASE"
                userPass = Split(get_Db_Password.getDbPassword(connType), ",")
                user = userPass(0)
                pass = userPass(1)
                connStr = "Provider=OraOLEDB.Oracle;User ID=" & user & ";Password=" & pass & ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" & IIf(connType = "ORA", "10.89.24.56", "10.89.24.54") & ")(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=" & IIf(connType = "ORA", "Annuity", "dwprod") & ")));Extended Properties=PLSQLRSet=1"
            Case "EXCEL"
                connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=YES"";Data Source=" & ThisWorkbook.FullName
        End Select
    
        On Error GoTo ErrorHandler
        conn.Open connStr
        Set GetConnection = conn
        Exit Sub
    
    ErrorHandler:
        MsgBox "Error opening connection: " & Err.Description, vbCritical
        conn.Close
        Set conn = Nothing
    End Sub
    
    ' 获取记录集
    Sub RetrieveResultSet(sql As String, ByRef rs As ADODB.Recordset, Optional connType As String = "BASE")
        Dim conn As ADODB.Connection
        Set conn = GetConnection(connType)
        
        If Not conn Is Nothing Then
            Set rs = New ADODB.Recordset
            rs.CursorLocation = adUseClient
            rs.Open sql, conn, adOpenKeyset, adLockOptimistic
            If rs.State <> adStateOpen Then
                MsgBox "Error opening Recordset: " & Err.Description, vbCritical
                rs.Close
                Set rs = Nothing
            End If
        Else
            MsgBox "No valid connection.", vbCritical
        End If
    End Sub
    

    注意事项

    • 确保在每次使用完RecordsetConnection对象后都调用.Close方法来释放资源。
    • 上述代码中,我将连接和记录集的创建、打开过程分开,并增加了错误处理逻辑,这样可以更清晰地管理资源和识别问题所在。
    • 考虑到兼容性和稳定性,推荐使用最新的Oracle客户端库以及相应的Provider名称。

    如果上述步骤仍不能解决问题,可能需要检查操作系统环境变量、Office信任中心设置等其他潜在影响因素。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 8月21日
  • 创建了问题 8月13日

悬赏问题

  • ¥15 把VMware项目复制到另一台电脑
  • ¥15 onlyoffice编辑完后立即下载,下载的不是最新编辑的文档
  • ¥15 求caverdock使用教程
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么