2014年3月6日 星期四

使用ODP.NET連線出現 "Connection must be open for this operation" 錯誤

但其實不是connection沒開的問題,ODP.NET根本在整人...


同事交接了一個專案過來,在同事的電腦上跑得好好的,但到我這邊來卻出現error,Exception 顯示連線沒有打開。

但是實際到發生錯誤的Fill DataSet的地方,卻看到Connection是打開的

這個專案連接Oracle,用的是ODP.NET,不是.Net內建的OracleClient,朝這個方向查了2小時終於找到頭緒,原因出在本機電腦安裝的ODP.NET版本跟專案的ODP.NET版本不同

(如果你沒有印象安裝過ODP.NET,那就是在裝oracle client的時候一起裝了)

ODP.NET安裝時會一併建立原則檔,這個原則檔會在你的ODP.NET安裝目錄下的PublisherPolicy 目錄裡,如

原則檔的作用是把指定版本都對應到本機的版本,如下
而專案使用的版本(9.2.0.700)不在這個對照表內,推測是這個原因,導致程式無法正常執行。

解決方案有二
  1. 以本機的Oracle.DataAccess.dll取代專案的DLL,版本一致就不會出問題
  2. 在專案的App.config或web.config的裡加入組件重導向的設定,以我的案例就是加入下圖的runtime區段,這樣程式就會跑去執行本機的Oracle.DataAccess.dll,程式便可正常執行。


以上,case close.

參考連結
Oracle11g ODP.NET安裝記錄 - 阿銘隨手Code- 點部落
組件繫結重新導向功能的實地觀察--以ODP.NET為例 - 黑暗執行緒
組件繫結重新導向鬼問題-版號高低之謎 - 黑暗執行緒
【茶包射手專欄】坎坷ODP.NET 10升級之路 - 黑暗執行緒