【问题标题】:VBA Detecting Oracle Driver version 32bit vs 64 bitVBA 检测 Oracle 驱动程序版本 32 位与 64 位
【发布时间】:2020-11-11 07:12:15
【问题描述】:

我正在尝试获取 Oracle 驱动程序的名称以在无 DSN 的 ODBC 连接字符串中使用,这样我就不必在安装了数据库的每台计算机上创建 ODBC 连接。

我有下面的代码,它适用于我(Windows 10 64 位、Oracle 驱动程序 32 位、12.2.0.1)。但是,对于另一个人,它不起作用,它只是找不到她的驱动程序(Windows 10 64 位,Oracle 驱动程序 64 位,12.2.0.1)。

网上说代码中的 2 个注册表项分别用于 64 位和 32 位(所以她的驱动程序应该在第一部分中找到)。我的驱动程序在代码的两部分都可以找到,她的也没有。

    Public Function GetOracleDriver()




     Dim strComputer As String
     Dim strValueName As String


    Dim arrValueNames As Variant
    Dim arrValueTypes As Variant
    Dim i As Long
    Dim R As Long
    Dim strKeyPath As String
    Dim strValue As String
    Dim objReg As Object
    Dim MyDriverName As String



    Const HKEY_LOCAL_MACHINE = &H80000002

    R = 1


    strComputer = "."

    Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

    strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
    objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

    For i = 0 To UBound(arrValueNames)
        strValueName = arrValueNames(i)
        objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
                   If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
                  GetOracleDriver = arrValueNames(i)
                  End If

        R = R + 1
    Next i

If IsNull(GetOracleDriver) Then

    R = 1

    strComputer = "."

    Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

    strKeyPath = "SOFTWARE\WOW6432NODE\ODBC\ODBCINST.INI\ODBC Drivers"
    objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

    For i = 0 To UBound(arrValueNames)
        strValueName = arrValueNames(i)
        objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
                   If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
                  GetOracleDriver = arrValueNames(i)
                  End If

        R = R + 1
    Next i


End If
'Debug.Print GetOracleDriver

End Function

【问题讨论】:

    标签: vba oracle ms-access odbc


    【解决方案1】:

    也许你的 excel.exe 和她的 excel.exe 是 32 位版本的 excel.exe。 在这种情况下,对注册表的访问会被 Windows 自动重定向到 Wow6432node。要关闭重定向,您可以使用来自 https://docs.microsoft.com/en-us/windows/win32/wmisdk/requesting-wmi-data-on-a-64-bit-platform.

    由于我没有安装 Oracle,我无法尝试我的代码,但是这个怎么样。

    Public Function GetOracleDriver()
    
         Dim strComputer As String
         Dim strValueName As String
    
        Dim arrValueNames As Variant
        Dim arrValueTypes As Variant
        Dim i As Long
        Dim R As Long
        Dim strKeyPath As String
        Dim strValue As String
        Dim objReg As Object
        Dim MyDriverName As String
    
    
    
        Const HKEY_LOCAL_MACHINE = &H80000002
    
        R = 1
    
    
        strComputer = "."
            
        '64bit
        
        'The code derives from
        'https://docs.microsoft.com/en-us/windows/win32/wmisdk/requesting-wmi-data-on-a-64-bit-platform
        Const HKLM = &H80000002
        Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
        objCtx.Add "__ProviderArchitecture", 64
        objCtx.Add "__RequiredArchitecture", True
        Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
        Set objServices = objLocator.ConnectServer(strComputer, "root\default", "", "", , , , objCtx)
        Set objStdRegProv = objServices.Get("StdRegProv")
    
        'Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
        Set objReg = objStdRegProv
        
        strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
        objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
    
        For i = 0 To UBound(arrValueNames)
            strValueName = arrValueNames(i)
            objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
            Debug.Print strKeyPath, strValueName, strValue
                       If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
                      GetOracleDriver = arrValueNames(i)
                      End If
    
            R = R + 1
        Next i
    End
    '32bit
    If IsNull(GetOracleDriver) Then
    
        R = 1
    
        strComputer = "."
    
        Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
    
        strKeyPath = "SOFTWARE\WOW6432NODE\ODBC\ODBCINST.INI\ODBC Drivers"
        objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
    
        For i = 0 To UBound(arrValueNames)
            strValueName = arrValueNames(i)
            objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
                       If strValue = "Installed" And (arrValueNames(i) Like "*oracle*" And arrValueNames(i) <> "Microsoft ODBC for oracle") Then
                      GetOracleDriver = arrValueNames(i)
                      End If
    
            R = R + 1
        Next i
    
    
    End If
    
    End Function
    
    

    【讨论】:

    • 谢谢!!我今天会试试。我在 ms 访问中执行此操作,而不是在 ms excel 中,但我假设这不会改变任何内容
    猜你喜欢
    • 2011-09-03
    • 2021-07-08
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多