自從家中與公司的機器分別改用Vista x64及Windows 2008 x64後,在享受爽快揮霍記憶體之餘,也一併開始體驗在新大陸拓荒的感覺。大部分的高階應用程式,多半可以x86虛擬環境執行,問題不大。但有不少涉及低階處理的程式選擇頓時劇減,例如: RamDisk因為Driver未具備簽章無法使用、能支援x64的免費防毒軟體屈指可數、之前提到重新Survey了DVD燒錄程式...

這些軟體上的短缺咬一咬牙就撐過了,最讓我痛苦的是原本部門大家慣用的ODP.NET 9207完全不支援x64版本,安裝程式根本沒法跑!

Google之後,知道Oracle 10.2g開始Support Vista/Windows 2008 x64,但無奈ORACLE網站不知怎麼,連續好幾天,下載連結都出現HTTP 404。最後終於在兩週後讓我下載到近500M的10204_vista_w2k8_x64_production_client.zip,安裝完成馬上用現有的專案試了一下,結果出現:

System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.

檢視權限等OK,試了一下重新開機,訊息變了:

System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B).

似乎是DLL版本不對,但我明明裝的是64bit Oracle Client,.NET程式限定Build for x86 CPU,為什麼跟我說: 在64 Mode下去讀了32bit Oracle Client? 感覺上恰恰相反才對。

反覆測試,忽然發現如果設定Build for AnyCPU或x64就可以順利連上Oracle,唯獨設成x86時會出現上述疑似相反的錯誤。設成x86時去讀取64bit Oracle Client DLL會發生問題,十分合理,只是一開始的錯誤訊息讓我有些迷惑。如果這是問題,那麼是否同時再裝32bit Oracle Client就好? 但,System.Data.OracleClient要如何知道該用32bit或64bit Oracle Client? 我每次都要改Registry或設PATH環境變數來切換使用的Client嗎? 一切的疑問,都要試了才知道!!

找到10203_vista_w2k8_x86_production_client.zip,裝在另一個目錄下(c:\oracle\ora10g vs c:\oracle\ora10g_x86),重新登入讓PATH環境變數中的c:\oracle\oar10g_x86\bin生效,x86就可以跑了。抱著期待的心情切成x64再跑,Yes! 也成功了!! 但這是x64 .NET用32bit Oracle Client的結果嗎?

使用Process Monitor解開了疑惑: System.Data.OracleClient會沿著PATH環境變數的路徑去找oci.dll,在x64下會略過c:\oracle\ora10g_x86\bin\oci.dll,找到c:\oracle\ora10g\bin\oci.dll後連線;x86時則是找到c:\oracle\ora10g_x86\bin\oci.dll就結束尋找,AnyCPU則與x64的行為相同。
(記得之前的PB6連Oracle9嗎? 一樣是用PATH法)

換句話說,OracleClient會依x64/x86決定適當的Oracle Client版本,不必勞煩我去手工切換。因此,如果想在Windows 2008/Vista x64上使用System.Data.Oraclient,最好32bit/64bit兩種10.2+版本的Oracle Client都要裝,並確定PATH變數中二者的bin目錄都有在其中,一切就搞定了。

說來簡單,卻花了我好幾個星期才解決,希望這點心得對其他也在x64叢林中挺進的同胞們有些幫助。


Comments

# by Wayne

Thanks for your tips. 我使用的是由Power Builder所開發的AP. 近日剛改在64位元Server上執行,也是發生OCI.DLL can not be load 的問題. 64位元的Oracle client 可正常連上Oracle DB,但AP 就不行, 安裝32位元的Oracle client, 問題就迎刃而解了.

# by Gavin

lz,太感謝你了﹗這種問題困擾了我足足1個星期﹐更可怕的是耽誤了項目的進度﹐按你的方法做了以后﹐問題解決﹐那種感覺﹐難以言表﹗

# by 韬光养晦

非常感谢您最后的结论,解决了我一大疑惑。有台使用64位oracle client的sap服务器(64位操作系统),用户提出再装32位的coracle client。我担心装上会导致sap会根据环境变量path使用32位的oracle client,进而导致潜在风险。看了您的文章后觉得不必担心了。谢谢。

# by jack

內容的連結,連過去看不到那個檔案,請問該去哪裡下載 thx

# by Jeffrey

to jack, http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html , 點選See All的連結,再去找Oracle Database Client for Microsoft Windows的下載連結。

# by Joanna

你實在是太棒了! 我google了一個多月了 終於解決在x64環境用vb連Oracle啦~ 3Q~3Q~3Q~3Q~ 如果有背景的話 我後面現在是咻蹦!咻蹦!咻蹦! 煙火直直放 Anyway 我要說聲"謝謝你"喔

# by Troy

我现在卡在System.Data.OracleClient requires Oracle client software version 8.1.7 or greater. 劳驾问一下检视权限有哪些步骤

# by Jeffrey

to Troy, 在我的經驗裡,有過Oracle Client資料夾(在本例中為 oracle\ora10g)中的子目錄NTFS權限被改成只有管理者可以讀取,造成錯誤的紀錄。可以用Process Monitor來確認此點,或者直接重設整個Oracle Client目錄,授予Everyone權限也是一種排除此因素的簡便做法。

# by Sand

請問一下…先裝32bit或是後裝會有問題嗎? 因為我原本只裝32bit後來跟你一樣的問題,在裝64bit,結果問題還是存在,必須要設啟動32bit應用程式,才可以跑

# by Jeffrey

to Sand, 依我的理解,先裝後裝應只會影響PATH環境變數中Oracle Client bin目錄出現的優先順序,但依文中的結論,OracleClient會依x64/x86決定適當的Oracle Client版本。或許你也可以用ProcMon觀察看看,應可真相大白。

# by 當矛頭指向你

終於解了 好在極早看到您的文章 thanks

# by jack

搞了2天,终于搞定了。。。谢谢。 记得服务器重启,否则环境变量不生效。另外试一下tnsping看看是调用的32 or 64的,若不对,修改环境变量前后顺序

# by jack

搞了2天,终于搞定了。。。谢谢。 记得服务器重启,否则环境变量不生效。另外试一下tnsping看看是调用的32 or 64的,若不对,修改环境变量前后顺序

# by Lemen

我也遇到跟楼主类似的问题,瞎忙活了一个多星期,无果,领导天天催进度,恨自己无能啊~~~今天看了博主这篇分享问题才迎刃而解!非常感谢!

Post a comment


13 + 6 =