Oracle9のWin32クライアント、古いからなぁ。
Win8-x64(64bit)上で、Excel2000(32bit)からOcale 9 clientのODBC(32bit)を通してOracle9なDBサーバに接続する話。
「ODBCドライバには32bitと64bitがあるからねー」というだけの筈の話が手ひどくはまった。ExcelのVBAで、標準モジュールの中に「ADODB.Connectionにdsn食わせて接続、んでクエリ発行してその結果を返す関数」を書いたら、tnsnames.oraも設定して、32bit ODBCの設定も登録&接続テストも成功してるのに、何しても接続を開くところで失敗する。
失敗する。
エラーメッセージをググったら権限が足りないとかあったので、oracle 9iが入っているフォルダを再帰でEveryone - Full Controlにして、実行ファイルの互換性プロパティからWinXP-SP3、管理者として実行にチェック。
そしたら動いてつながってクエリ投げたり結果を表示したりできた。
と言うことでexcel.exeも同じく互換性プロパティで「WinXP-SP3、管理者として実行」に設定。
エラー文でググったら、Oracle 9クライアントは、呼び出し元アプリケーションの絶対パスに半角括弧があると、接続に失敗するとのこと。
http://blog.yaju.jp/200703/article_8.html
そうだね。C:\Program Files (x86)\Microsoft Office\Officeだったね。あるね、半角括弧。
ということで C:\opt\Office_x86_lnk から C:\Program Files (x86)\Microsoft Office\Office にシンボリックリンクを貼る。
そして、C:\opt\Office_x86_lnk\EXCEL.EXE を起動してさっきの続き。
いや普通って、これ全然普通ちゃうし。ああもう。
コードはこんなん
で、tnsnames.oraの中身はこれ。
MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydbsv002)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb01)
)
)
しかしこの状況、Accessをフロントエンドに使った業務アプリとかどないしようかね。導入手順が数ステップほど増えるだけといえばそうなんだろうけど。いやしかし。
「ODBCドライバには32bitと64bitがあるからねー」というだけの筈の話が手ひどくはまった。ExcelのVBAで、標準モジュールの中に「ADODB.Connectionにdsn食わせて接続、んでクエリ発行してその結果を返す関数」を書いたら、tnsnames.oraも設定して、32bit ODBCの設定も登録&接続テストも成功してるのに、何しても接続を開くところで失敗する。
管理者権限が必要
で、Oracle9クライアント付属のSQLPlusW.exeから接続を試してみる。失敗する。
エラーメッセージをググったら権限が足りないとかあったので、oracle 9iが入っているフォルダを再帰でEveryone - Full Controlにして、実行ファイルの互換性プロパティからWinXP-SP3、管理者として実行にチェック。
そしたら動いてつながってクエリ投げたり結果を表示したりできた。
と言うことでexcel.exeも同じく互換性プロパティで「WinXP-SP3、管理者として実行」に設定。
実行ファイルパスに半角括弧が含まれてて死亡
これでどうかと試したら別のエラーメッセージ、やっぱり開けない。エラー文でググったら、Oracle 9クライアントは、呼び出し元アプリケーションの絶対パスに半角括弧があると、接続に失敗するとのこと。
http://blog.yaju.jp/200703/article_8.html
そうだね。C:\Program Files (x86)\Microsoft Office\Officeだったね。あるね、半角括弧。
ということで C:\opt\Office_x86_lnk から C:\Program Files (x86)\Microsoft Office\Office にシンボリックリンクを貼る。
そして、C:\opt\Office_x86_lnk\EXCEL.EXE を起動してさっきの続き。
成功
普通に動きよった。なんなのこれ。もう。いや普通って、これ全然普通ちゃうし。ああもう。
コードはこんなん
cn = CreateObject("ADODB.Connection")
cn.ConnectionString = "Provider=OraOLEDB.Oracle.1;Data Source=MYDB;User ID=MYDB_USER;Password=MYDB_USER"
cn.Open
MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydbsv002)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mydb01)
)
)
しかしこの状況、Accessをフロントエンドに使った業務アプリとかどないしようかね。導入手順が数ステップほど増えるだけといえばそうなんだろうけど。いやしかし。