Как подключиться к источнику данных IBM DB2 с помощью VBA в 64-разрядном формате Excel

#excel #vba #db2 #64-bit

Вопрос:

Моя компания планирует перейти с 32-разрядного MS Office 365 на 64-разрядный эквивалент. Я разработал инструмент в Excel, который подключается к IBM DB2 (и источнику данных MySQL тоже). Этот инструмент отлично работал в течение многих лет в разных версиях WINDOWS (XP/7/10, независимо от того, 32 или 64 бит) в разных 32-битных версиях MS Office (XP, 2007,2013 и 365Pro). Но при запуске инструмента на 64-битной версии MS Office 365Pro я пытаюсь подключиться к базе данных (все другие препятствия, например, объявления PtrSafe, устранены). Я установил 64-битную версию клиента ODBC IBM DB2 и настроил ее в SysWOW64ODBCAD, и тест подключения успешно возвращается. Насколько я предполагаю, по крайней мере, с водителем все в порядке. При вызове для открытия соединения в VBA я всегда получаю следующее сообщение об ошибке:

введите описание изображения здесь

Мне кажется, что каким-то образом Excel не распознает проблему с регистрацией драйверов DB2 ->? Вот мой код:

 Option Explicit

Public oDB2Connection As ADODB.Connection
Public zQuery As String
Public zDB2User As String
Public zDB2Pwd As String
Public oRecordSet As ADODB.Recordset

Public iLoginTrials As Integer
Public zTable As String

Sub ConnectDB2()
Dim PS As stPositions
Dim bFirstLogin As Boolean
Dim zStr As String

'//create connection object
Set oDB2Connection = New ADODB.Connection
Set oRecordSet = New ADODB.Recordset


On Error GoTo Errorhandler

iLoginTrials = 0
bFirstLogin = False

With oDB2Connection
    While (.State = 0)
        If (.State = 0) Then
            zDB2User = oMainSheet.Range(RANGE_DB_USR).Value
            zDB2Pwd = oMainSheet.Range(RANGE_DB_PWD).Value
        
            If (AccessLevel < AL_RO) Then
                bFirstLogin = True
                
                With DlgLogin
                    .LoginReadOnly.Visible = True
                    .LoginPM.Visible = True
                    .LoginAdmin.Visible = True
                    .LoginReadOnly.Value = 1
                    .UserName = USER_RO
                    .Password = "member"
                    
                    .StartUpPosition = 1 'posCenterOwner
        
                    PS = PositionForm(WhatForm:=DlgCalendar, AnchorRange:=ActiveSheet.Cells(1, 1))
                    .Top = PS.FrmTop   ' set the Top position of the form
                    .Left = PS.FrmLeft ' set the Left position of the form
                    .Show '//RunUserInterface
                End With
            End If
        End If
                
      
        .ConnectionString = "Driver={IBM DB2 ODBC DRIVER};" _
            amp; "Database=<myDB>;" _
            amp; "Hostname=<myHost>;" _
            amp; "Port=<myPort>;" _
            amp; "Protocol=TCPIP;" _
            amp; "Uid=" amp; zDB2User amp; ";" _
            amp; "Pwd=" amp; zDB2Pwd amp; ";"
    
        '//set cursor location
        .CursorLocation = adUseClient
    
        '//open database
        .Open
            
        zQuery = "SET CURRENT SCHEMA = 'DCODB2'"
        Message zQuery
        .Execute zQuery, , adExecuteNoRecords
        
        If (.State = 1) Then
            With oMainSheet
                .Unprotect ("*")
                .Range(RANGE_DB_USR).Value = zDB2User
                .Range(RANGE_DB_PWD).Value = zDB2Pwd
                .Protect ("*")
            End With
        End If
        
        '//in case of failure try again to login
        PP iLoginTrials
        If (iLoginTrials > 3) Then
            zStr = "Access to PM database denied"
            MsgBox zStr
            Message zStr
            End
        End If
    Wend '//.State = 0
    
    If (.State And bFirstLogin) Then
        ShowDlgDone "Connection to DB2 successfully established", vbModal
        Message "Userlevel: " amp; zDB2User
    End If
End With '//oDB2Connection

Exit Sub
    
    
Errorhandler:
    zDB2Pwd = ""
    With oMainSheet
        .Unprotect ("*")
        .Range(RANGE_DB_USR).Value = ""
        .Range(RANGE_DB_PWD).Value = zDB2Pwd
        .Protect ("*")
    End With
    
    MsgBox "Error: " amp; ERR.Description
    Resume Next
End Sub
 

Аналогичная конструкция для подключения к MySQL также не работает для 64-разрядного Excel.

Комментарии:

1. По соображениям конфиденциальности я заменил параметры подключения. В исходном коде я не использую «<>»…

Ответ №1:

Я узнал об этом сам! Просмотр реестра в разделе HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.Драйверы INIODBC, я увидел там имя драйвера, выглядящее немного иначе: «ДРАЙВЕР IBM DB2 ODBC — IBMDBCL1»

В своем коде я изначально написал: «ДРАЙВЕР IBM DB2 ODBC».

Итак, с помощью вышеприведенного исправления я заставил его работать, ура!!