1. 程式人生 > >C#,delphi7在64位作業系統上連線Oracle 11g的問題和解決方案 BadImageFormatException

C#,delphi7在64位作業系統上連線Oracle 11g的問題和解決方案 BadImageFormatException

環境:windows2008R2企業版64位,安裝Oracle 11g 64位版服務端。C#3.5開發的b/s系統,32位版。delphi7開發的c/s服務

錯誤提示:

Oracle 11g 64位版在64位作業系統上連線Oracle的問題和解決方案 BadImageFormatException

同時解決Delphi7.0採用Oledb連結64位oracle11g出現密碼不正確的問題。

嘗試載入Oracle客戶端庫時引發BadImageFomatException。如果在安裝32位Oracle客戶端元件的情況下以64位模式執行,將出現此問題。

錯誤原因是原來WinXP機子上所安裝的OracleInstantClient是32位,所以編譯的程式所用的OracleClient也是32位的,從而導致相容問題。當然,如果在64位作業系統上重新安裝64位的Oracle客戶端再重新編譯程式也是能解決問題的。這裡我們介紹一種簡單的方法來移植程式。

如果在伺服器端安裝32位的oracle9i客戶端,要注意密碼的大小寫的問題,9i客戶端預設會把密碼轉換成大寫,要特別注意。

總之解決問題的方法是:在服務端再安裝一個Oracle 11g 32位版的客戶端

我的奮鬥-System.Data.OracleClient on Windows 2008 x64

自從家中與公司的機器分別改用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叢林中挺進的同胞們有些幫助。

相關推薦

C#delphi7在64作業系統連線Oracle 11g的問題解決方案 BadImageFormatException

環境:windows2008R2企業版64位,安裝Oracle 11g 64位版服務端。C#3.5開發的b/s系統,32位版。delphi7開發的c/s服務 錯誤提示: Oracle 11g 64位版在64位作業系統上連線Oracle的問題和解決方案 BadImageFor

libcurl在centos6.4 64作業系統不支援https的解決方案

問題:      在程式內使用libcurl庫訪問https的網址時,始終返回 CURLE_UNSUPPORTED_PROTOCOL      經查詢發現是libcurl庫檔案編譯時沒有選擇支援ssl,預設的li

C#在64作業系統用X86方式連線64Oracle的問題解決方案

C#使用System.Data.OracleClient連線Oracle資料庫。之前在WinXP上正常執行的程式移植到Windows 2008 x64上之後就連不上資料庫了,錯誤資訊如下: 嘗試載入Oracle客戶端庫時引發BadImageFomatException。

CC2540是一款高性價比低功耗片系統(Soc)解決方案它適合藍牙低功耗應用領域

數字 醫療 保持 國內 定時 技術 定位 集成電路 性能 CC2540是一款高性價比,低功耗片上系統(Soc)解決方案,它適合藍牙低功耗應用領域,極少的外圍元器件以及強大網絡節點建立成為可能。CC2540是一款含有高速和低功耗8051內核的RF收發器。適用於低功耗系統,有超

用Navicat連線Oracle資料庫出錯解決方案

 用Navicat連線Oracle資料庫時出現如下錯誤     上網一查原來是oci.dll版本不對。因為Navicat是通過oracle客戶端連線Oracle伺服器的,Oracle的客戶端分為兩種,一種是標準版,一種是簡潔版,即Or

ireport連線Oracle字符集亂碼解決方案

ireport與oracle連線,資料來源連上了,可是取出的中文欄位都是亂碼 select userenv('language') from dual;   SIMPLIFIED CHINESE_CHINA.US7ASCII 通過查詢,字符集為us7ascii 解決辦法 :

可以ping通但無法通過ssh連線虛擬機器的解決方案

    今天在虛擬機器上裝了一個 Linux 玩玩, 但在啟動 Linux 後,在 Windows 中通過 Xshell 以 SSH 方式連線到 Linux 時卻連線不上,於是開啟 CMD 視窗,輸入了 ping 192.168.220.128,返回結果顯示可以拼通: Pin

剛入門對於浮動float的作用、影響解決方案它們的缺點

浮動的作用 1、是為了讓元素並排 2、轉換行級標籤成塊級標籤,使其可以設定寬高使用浮動帶來的影響 脫離文件流,對其後面緊隨的元素產生影響,進行覆蓋,優先顯示 清除浮動解決方案 (1)浮上去的元素,給它設定float:left;讓它也浮動起來,但是它的結構便不是自然的結構了,

C# 連線Oracle 11g(注:可少走彎路)

string connString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=130.147.246.144)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ECMS)));Persist Secur

linux centOs中安裝好資料庫客戶端用plsql連線oracle

  原創作品,轉載請在文章顯眼位置註明出處:https://www.cnblogs.com/sunshine5683/p/10030375.html  首先,回顧上篇 CenOs7安裝oracle圖文詳細過程(02) ,安裝好oracle後再伺服器端使用sqlplu

Oracle資料庫安裝+漢化版PLsql+Oracle外掛plsql連線Oracle步驟報錯解決辦法

    從https://download.csdn.net/download/fxiaoyaole/10449523 此連結下載裡面有所資源,資源包括(Oracle兩個資料庫壓縮包win64_11gR2_database_1of2, win64_11gR2_database

centos7 64系統jdbc連線oracle報錯問題

這兩天發生了一個錯誤,感覺挺奇葩的,記錄下來,哈哈。 報錯如下: ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is

163264作業系統各型別的長度整理

特別是int相關的型別在不同位數機器的平臺下長度不同。C99標準並不規定具體資料型別的長度大小,只規定級別。作下比較:   (1)16位平臺   char         1個位元組8位 

C#連線Oracle 11g 無需安裝Oracle客戶端

1.首先到Oracle網站上下載ODAC 下載地址1:http://download.csdn.net/detail/easyboot/9456476 下載地址2:http://www.oracle.com/technetwork/topics/dotnet/downloa

kettle在64作業系統的配置

 1. Download swt.jar for Win642. create folder \libswt\win64 and paste the downloaded swt.jar3. copy the following files from \libswt\win3

關於JavaMail 發郵件本地傳送成功linux伺服器傳送連線超時問題的解決方案

伺服器上報錯資訊        send mail err:Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn’t connect

64CPU64作業系統64應用程式三者之間的關係

64位CPU 目前市面上的CPU都是64位且相容32位的CPU,既支援64位指令集,也支援32位指令集。在這樣的CPU上面,既能安裝64位作業系統,也能安裝32位作業系統。 64位作業系統 目前主流作業系統都是64位作業系統。只有64位作業系統才能發揮CPU中的64位指令

在64作業系統執行32的程式

執行 32 位程式 WOW64 子系統使 32 位程式能夠在基於 x64 版本的 Windows Server 2003 和 Windows XP 專業 x64 版的執行而不用修改。WOW64 子系統是通過在基於 x64 版本的 Windows Server 2003 和

Linux(CentOS6_64)下安裝Oracle 11g

用戶組 root images img roo bsp 最小化安裝 inux .sh 前提: 1、請務必在win下安裝Oracle至少5遍。 2、請務必掌握基本的Linux命令。 準備好Oracle linux64位安裝包(官方下載2個壓縮文件)準備好虛擬機VMware

C# FileStream進行FTP服務傳文件下載文件

兩個 upload open object private 原因 als down adc 定義FileStream類的操作類:操作類名: FtpUpDown 上傳文件 /// <summary> /// 上傳文件 /// <