3

MySQL 4.07 データベースを使用する古い VB6 プログラムがあります。私のWin XP 64ビットマシンで開発されました。Win XP 64 マシンで問題なく動作し、Win7 64 ビット マシンでも問題なく動作します。しかし、ユーザーの 1 人が Win7 64 マシンで実行しようとすると、失敗します。

    "Run-time error '-2147467259 (80004005)': [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified".  

奇妙なのは、ODBC ドライバーがインストールされており、SysWOW64 と system32 にあることです。

次のコードは Form_Load で実行され、エラーが発生する可能性が高い場所です (32 ビット ドライバーは NT Server 2.5 用であり、64 ビット ドライバーは新しいバージョンであることに注意してください)。

    If IsHost64Bit() = True Then
        mstrConnString = "driver=MySQL ODBC 3.51 Driver;server=mysqleng;database=engprogs;port=3306;UID=user;PWD=########"
    Else
        mstrConnString = "driver=MySQL;server=mysqleng;database=engprogs;port=3306;UID=user;PWD=########"
    End If

    Set ADOCn = New ADODB.Connection
    ADOCn.ConnectionString = mstrConnString
    ADOCn.Open mstrConnString

SysWOW64 内の odbcad32.exe のプロパティを確認したところ、[ドライバー] タブにユーザー マシンの MySQL ODBC 3.51 が表示されました。

どんなアイデアでも大歓迎です。

ありがとう、ボブ

4

2 に答える 2

1

Mark Kram との話し合いの結果、VB6 を Win7 64 ビット コンピュータにインストールすることにしました。インストール中、互換性の警告を無視しました。私が知る限り、それはインストールされ、正常に動作します。そのため、コードを 1 ステップ実行したところ、"IsHost64Bit()" が Win7 64 で正しく機能していないことがわかりました。「IsHost64Bit()」ルーチンは、64 ビット コンピュータが 32 ビットであることを示していました。したがって、32 ビットから「mstrConnString」をロードしていました。そのため、プログラムの開始時に失敗していました。

「IsHost64Bit()」には以下が必要です。

Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Declare Function GetModuleHandle Lib "kernel32" _
Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

Private Declare Function IsWow64Process Lib "kernel32" _
(ByVal hProc As Long, ByRef bWow64Process As Boolean) As Long

「IsHost64Bit()」ルーチン:

Public Function IsHost64Bit() As Boolean
Dim handle As Long
Dim is64Bit As Boolean

' Assume initially that this is not a WOW64 process
is64Bit = False

' Then try to prove that wrong by attempting to load the
' IsWow64Process function dynamically
handle = GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process")

' The function exists, so call it
If handle <> 0 Then
    IsWow64Process GetCurrentProcess(), is64Bit
End If

' Return the value
IsHost64Bit = is64Bit
End Function

「IsHost64Bit()」を次のように置き換えました。

Dim wmi, prc
Dim prcOS As String

Set wmi = GetObject("winmgmts:\\")
For Each prc In wmi.execQuery("SELECT * FROM Win32_Processor")
  Debug.Print prc.Name, "Bit Sizes - ADDR:"; prc.AddressWidth, "DATA:"; prc.DataWidth
  prcOS = Str(prc.DataWidth)
Next

また、Form_Load ルーチンは、次のように 64 ビットを正しくチェックするようになりました。

If prcOS = " 64" Then
    mstrConnString = "driver=MySQL ODBC 3.51 Driver;server=mysqleng;database=engprogs;port=3306;UID=user;PWD=########"
Else
    mstrConnString = "driver=MySQL;server=mysqleng;database=engprogs;port=3306;UID=user;PWD=########"
End If

Set ADOCn = New ADODB.Connection
ADOCn.ConnectionString = mstrConnString
ADOCn.Open mstrConnString
于 2012-09-24T14:17:49.423 に答える
0

まず、MySQL ODBCコネクタ(現在のバージョン)をダウンロードします

以前のMySQLODBCコネクタを削除します

すべてのオプションを使用して新しいバージョンをインストールします

これは私のために働いた

32ビットバージョンは64ビットマシンでも動作します。

于 2012-10-03T17:39:03.940 に答える