Translate

2014年4月19日土曜日

ODBC接続に失敗したので、試しました -32bit版ODBCドライバが表示されないので-

 こんにちは、稲田商会です。

 以前の投稿(こんにちは、稲田商会です。: ODBC接続に失敗したので、調べました)の続きです。

 前回投稿では、Win7の64ビット版でOfficeからODBCに接続する際、Office2007は32ビットアプリなので、32ビットのドライバを入れ、操作もodbcad32.exeと32ビット版のコマンドを使う必要があるとの内容でした。

 で、その手順をしようとした際、ODBCの画面に32ビット版のMySQLODBCドライバをインストールしても反映されない問題が出てきました。
 以下、経緯を含めて記します。




○環境
 PC: Windows7(64ビット版)
 アプリ: Office2007のAccess(32ビットアプリ)
 データベース; localhostにxamppで動作しているMySQL(5.5.27)
 ODBC用ドライバ; MySQLODBCドライバ5.2.6(32ビット版、64ビット版) 

○問題発生までの経緯
1.以前(2013年以前)にMySQLODBCドライバ(32ビット版)をインストールし、32ビット版ODBCコマンドで設定、Office2007のAccessからODBCへ正常にアクセス出来ていた。

2.暫く時間があいて、設定などの詳細の記憶がなくなっていた。

3.2014年4月に、新たにOffice2007のAccessから接続するのにユーザDSNを作成しようとしてODBCの設定画面をみるとドライバのタブでMySQLのドライバが表示されていない状態となった。

4.「MySQLのドライバを削除した」ものだと思い、MySQLODBCドライバ(64ビット版)をダウンロードしてきてインストールし、ドライバのタブに表示されることを確認した。

5.ユーザDSNを正常に作成できたため、Accessから接続しようとすると「指定されたdsnには、ドライバーとアプリケーションとのアーキテクチャの不一致が含まれています」などと表示されて、エラーになる。

6.情報を探して、「32ビット版ドライバをインストールする必要がある」ことが判る。

7.64ビット版をアンインストールした上で、MySQLODBCドライバ32ビット版をインストールすると、ドライバのタブに表示されない。(システムのODBCコマンド、32ビット版ODBCコマンド(odbcad32.exe)の両方とも)

○原因の推定
 MicrosoftのHPに次の情報がありました。

64 ビット版の Windows で、ODBC アドミニストレーター ツールが 32 ビットと 64 ビット両方のユーザー DSN を表示する(Microsoft)
引用、ここから。

現象:
64 ビット版の Microsoft Windows オペレーティング システムには、以下のバージョンの Microsoft ODBC (Open Database Connectivity) データ ソース アドミニストレーター ツール (Odbcad32.exe) が含まれています。
  • 32 ビット版の Odbcad32.exe ファイルは、%systemdrive%\Windows\SysWoW64 フォルダーにあります。
  • 64 ビット版の Odbcad32.exe ファイルは、%systemdrive%\Windows\System32 フォルダーにあります。
Odbcad32.exe ファイルは、次の種類のデータ ソース名 (DSN) を表示します。
  • システム DSN
  • ユーザー DSN

現象 1

32 ビット版の ODBC アドミニストレーター ツールは、32 ビットのシステム DSN、32 ビットのユーザー DSN、および 64 ビットのユーザー DSN を表示します。64 ビット版の ODBC アドミニストレーター ツールは、64 ビットのシステム DSN、32 ビットのユーザー DSN、および 64 ビットのユーザー DSN を表示します。

現象 2

SQLDataSources 関数では、アプリケーションのアーキテクチャに関係なく、すべてのバージョンのユーザー DSN が返されます。32 ビット アプリケーションで呼び出される SQLDataSources 関数では、32 ビット ドライバーのシステム DSN のみが返されますが、ユーザー DSN については 32 ビット ドライバーと 64 ビット ドライバーの両方が返されます。同様に、64 ビット アプリケーションで呼び出される SQLDataSources 関数では、64 ビット ドライバーのシステム DSN のみが返されますが、ユーザー DSN については 32 ビット ドライバーと 64 ビット ドライバーの両方が返されます。そのため、SQLDataSources 関数から返されるユーザー DSN を使用してアプリケーションが接続を行う場合、次のエラー メッセージが表示されることがあります。
データ ソース名および指定された既定のドライバーが見つかりません
たとえば、次のような状況で問題が発生します。32 ビット ドライバー "Microsoft Access ドライバー (*.mdb)" 用のユーザー DSN を作成します。このドライバーには、対応する 64 ビット バージョンがありません。64 ビット アプリケーションで呼び出される SQLDataSources 関数は、この 32 ビットのユーザー DSN を返します。ただし、この 32 ビットのユーザー DSN を介して接続を行うと、このセクションの上記のエラー メッセージが表示されます。

原因:
ユーザー DSN は、次のレジストリ サブキーの下に保存されています。
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI
このレジストリ サブキーに関して、レジストリのリダイレクトは有効ではありません。そのため、ユーザー DSN は 32 ビット版と 64 ビット版両方の ODBC アドミニストレーター ツールで表示されます。 
(後略)
引用、ここまで。

 どうも、私が以前に設定した時よりも後で、ODBCのドライバを64ビット版と32ビット版で互換性が出るようにOSの設定を見直し、OSのアップデートがされていたようです。
 そのときに32ビットドライバがインストールされていても表示されないようになってしまったのではないでしょうか。

○問題の対策方法
 今回の問題はODBCドライバで64ビット版、32ビット版がOSで上手く取り扱えていないところが問題と判りました。
 状況を整理すると、

32ビット版ドライバ
 ・ドライバタブに表示されない
 ・ドライバが認識されないため、(ドライバが指定出来ず)DSNを作成出来ない

64ビット版ドライバ
 ・ドライバタブには表示される
 ・ドライバが認識されるため、DSNは作成出来る
 ・Access2007からアクセスした場合にエラーが発生する

OS、MySQLODBCドライバ
、・64ビット版と32ビット版では異なる場所(この場合「Program Files」と「Program Files(x86)」)にインストールされる
 ・レジストリの設定などで64ビット版と32ビット版を共通に処理しているところがある

 以上の状況から、64ビット版と32ビット版の両方がインストールすれば機能的に上手く動作するだろうと考えられ、また別々にインストールされるので上書きはないものと考えられました。

 これから、32ビット版のMySQLODBCドライバをインストールしたままで、64ビット版のMySQLODBCドライバをインストールしてみました。(32ビット版と64ビット版は同じバージョンのものです)

 結果として64ビット版のODBCコマンドでも、32ビット版(odbcad32.exe)でもMySQLODBCドライバが表示されるようになりました。(32ビット版、64ビット版の2組ではなく1組のみ)

 また、64ビット版のODBCコマンドからDSNを設定して、Access2007から接続しても問題無く接続出来ました。

 なお、「プログラムと機能」で見るとMySQLODBCドライバが2つエントリーされており、32ビット版、64ビット版のそれぞれでアンインストール出来そうです。

○結論
 ODBCのドライバが32ビット版で認識されない場合は、32ビット版と64ビット版の両方をインストールしてやれば良い。

 以上、正しい対処方法ではないかもしれませんが、どなたかの役に立つなら幸甚です。

 それでは、今回はこのへんで。

0 件のコメント:

コメントを投稿