#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».
Итак, с помощью вышеприведенного исправления я заставил его работать, ура!!