一個業務系統,使用到了ArcEngine庫,訪問資料庫為Oracle,開發語言為C#,開發IDE以及打包的工具都是Visul sduio 2008。
ArcEngine庫是ArcGIS針對二次開發組成的一個庫,以Com組件的形式提供。
本以為這是一個比較簡單的問題,但照實的耗費了我兩個星期左右的時間,當然這兩個星期裡面也在幹很多別的活。
在此問題發生之前,我知道,.Net會預設會把系統編譯成AnyCpu,產生中繼語言,然後部署的機器上啟動並執行時候,才根據具體的機器的cpu的型號產生相應的運行代碼。
1.在機器上安裝Oracle 32位的用戶端程式,編譯用戶端的時候,編譯成any cpu的。
這種方案是我們首先嘗試的方案,對他能運行起來的希望就不是太大,但這些都是現成的,運行不起來,也可以看一下報的什麼錯誤。再測試連接資料庫的時候,提示系統以64位元模式運行,而Oracle庫位32位,調用失敗(大概就是這個意思)。
我們在這個過程可以得到以下結論:
(1).Oracle Client 32位可以在64位的Win7下安裝,但能否正常運行還未知。
(2).如果Oracle Clinet 也會死64位的話,系統能夠正常運行起來的可能性很大。
2.下載Oracle Clinet 64位,安裝,測試。但整個過程在安裝過程中老是提示安裝不上。測試失敗,就沒有接著嘗試。又想到訪問Oracle又很多種訪問方式,oledb也會死一種訪問方式,這樣可以脫離Oracle CLinet,就不存在Oracle用戶端和系統位元不匹配的問題了。
3.把系統訪問資料庫的相關的串連方式修改為Oldeb,重新測試,還是測試失敗,提示的錯誤資訊和第一次嘗試差不多。後來到網上找才發現,Oledb的訪問方式也必須再機器上安裝Oralce用戶端。這個是我以前沒有注意到的。
通過這次嘗試,知道了:
訪問Oracle資料庫必須以來Oracle用戶端,完全不用的方案在網上似乎還沒有。當然如果有哪位兄弟知道,看了本文章後一定要告訴小弟。
4.放棄串連資料庫的方式,還是改位Oracle Clinet方式。和別人要了一個Oracle Clinet 的64位的安裝包,順利安裝,但測試資料庫連接的時候還是錯誤,但提示的資訊已經不一樣,再網上搜了一下,說是以前機器上裝的Oracle可能沒有卸載乾淨,會出現這樣的問題。很崩潰,沒辦法,又換了另外一台win7的機器,但那台機器上一級裝了32位的Oracle。
5.為了仔細瞭解錯誤的原因,我在Win7上安裝了開發環境,首先我先測試了一些最簡單的,看看是不是ArcEngine有什麼問題。使用了一個ArcEngine內建的例子,運行,錯誤。這下我就有點鬱悶了,串連資料庫的問題還沒有解決,連ArcEngine也運行不起來?馬上我又想到,ArcEngine是不是也有64位的,而我平常用的都是32位的?於是我把編譯選項設定為X86,運行,成功。看來確實是ArcEngine位元的原因。那ArcEngine有沒有64位的?到網上找了一下,答案是沒有,ESRI官網給的解決方案也是使用X86進行編譯。這樣一來,我就發現現在研究Oracle Clinet 64位已經沒有意義了,因為我們的系統只能編譯成32位的即X86。
因為我們的系統需要用我們自己寫的C++ COM組件,需要手工註冊,我們再同一級目錄下寫了一個bat檔案,用來註冊,但現在怎麼也註冊不上。後來查到,在win7中註冊必須使用全路徑,不能使用相對路徑。修改了絕對路徑後,註冊成功。
6.最終確定使用Oracle Clinet 32位,程式也編譯成32位。在開發環境中編譯,再串連資料庫時,又是失敗,而且失敗的原因和以前都不一樣,到網上尋找後發現,由於Win7的使用者權限比較複雜,需要在系統系統的時候以管理員身份啟動。我就右鍵點擊VS的捷徑,點擊以管理員身份啟動,把項目載入進來。運行,串連資料庫成功。呵呵,很激動。看來現在遇到的問題已經不是64位的問題了,而是win7的問題。串連資料庫,使用ArcEngine庫,使用com組件,都成功,看來形勢一片大好。解決就打包,但打完包,安裝後,直接雙擊運行出錯。忽然想起來要用管理員權限運行,就進入到安裝目錄,右鍵點擊主exe,以管理員權限運行,但還是有問題,太奇怪了。
.net程式打包部署無非是把Relase下面的檔案壓縮一下,然後再解壓出來,應該沒什麼問題啊?我把Debug檔案夾拷到案頭上,運行,沒問題。又把Debug檔案夾拷到安裝目錄的同一級下,運行,出錯。
看來和路徑有關。我又看了一下預設的安裝路徑,C:\Program Files (X86)\公司簡稱\產品名稱\,難道是()或是空格的問題?因為很多工具都對空格或是()這樣的字元敏感,不支援這樣的安裝路徑。
7.卸載系統後,再次安裝,把安裝目錄下的()去掉。安裝目錄下,以管理員權限運行,串連資料庫成功,啟動主程式也成功,看來確實是()的問題。後來又發現以相容模式運行也可以成功運行,並且在運行一次後可以把相容模式的配置資訊儲存下來,下次直接雙擊即可。
至此整個問題已經解決。
後來想在安裝的時候判斷一下,如果是win7作業系統,並且安裝目錄有(),就提示使用者在WIn7下,安裝路徑不能存在()。但這個問題搞了一下午,沒搞出來,而且這個也不是太最要,還有很多別的事要做,使用者就十個人左右,告訴他們一下就可以了。
ps:現在64位WIn7還比較少,之所以我那麼曲折的解決這個問題,而且很多為什麼還都不知道,主要因為我自己對WIn7和64位就不瞭解。但大多說情況下,64位機器還都是被當成伺服器用,很少當成pc機用,但有很多大單位,事業單位已經都是使用的64位的機器了,而且配置超好...
整個過程主要是記錄我解決這個問題的步驟,其他的就沒什麼了,對熟悉Win7和64位的兄弟來說,更是小菜一碟。我寫著句話主要是害怕沒吐口水。。呵呵。。