OpenAccess for Oracle 的資料提供者以及組態檔的連線字串
本篇文章是快速入門的番外篇,因為不見得大家都會遇到這個問題,不過遇上了,就很難搞,為了節省大家時間,還是簡單分享一下解決辦法。
各位還記得一開始我們設定的 Oracle 資料提供者是誰嗎?下圖幫大家回憶一下:
我們一開始選的其實是 .Net Framework Data Provider for Oracle,也就是 OracleClient,但真正記錄在組態檔中的資料連線提供者,其實已被置換為 Oracle.DataAccess.Client 了,所以才會透過 Oracle.DataAccess 存取 Oracle 資料庫。
現在我們看看 OpenAccessWebApp01Model 專案中,app.config 的連線字串:
所以,還記得『OpenAccess快速入門01』那篇文章有一個錯誤畫面嗎:
指的就是找不到組態檔中所設定的資料提供者『Oracle.DataAccess.Client』。
找不到 Oracle.DataAccess.Client 的處理方式
首先,這個訊息很明確是說找不到 Oracle.DataAccess 這個組件,那是不是把 Oracle.DataAccess.dll 放到 bin 目錄下就好呢?不行,加入參考,不行,還會衍生找不到 oraocci11.dll 或 oraocci10.dll 的問題,因為這個問題的各種情況我應該都遇到了,現在經驗豐富,不過我們這系列講的是 OpenAccess,就不多說細節,直接講一些狀況的解法:
● 最重要的原因是:在 GAC 中找不到 Oracle.DataAccess。
加入參考或放到 bin 目錄下都沒用,它硬是要找 GAC。但是很麻煩的是,有時候明明有裝 Oracle Client,為什麼 GAC 沒註冊?
● 有可能是 Oracle 的本位目錄不在基本目錄底下。(也就是本位目錄不是基本目錄的子目錄)
另外也有可能,明明有註冊,但還是找不到,可能的解法有:
● VS2012 請重新以系統管理員身份啟動。
● 把 Oracle 本位目錄的權限放大給 VS2012 的執行身份(通常我就直接開 Everyone 唯讀,系統人員開完全控制)。
還有一種錯誤訊息叫做 Oracle.DataAccess 的版本不對,這問題超囧!總之,不知道為什麼,OpenAccess 相關組件鎖死 10g 版本的 DLL,所以如果 GAC 中只有 Oracle.DataAccess 2.112.1.0 ( 11gR2),沒有 2.102.2.20(10gR2),也沒有 Policy.2.102.Oracle.DataAccess,就會出現這樣的錯誤:
解法就是重新安裝 Oracle Client,或執行 XCopy 的 install.bat。
關於 ODP.Net 的連線字串
其實 app.config 中的連線字串並不正確!沒想到吧,我發現時也是大錯愕,因為目前為止,我們透過測試專案調用 Model 專案時,並沒有發生問題。那什麼時候會發生問題?設定到 Web 專案的 web.config 時,執行時期就會發生問題了:
查了 Oracle 官方的說明才知道:
Connecting to Oracle Database
根本就沒有「unicode=True」啊,所以其實我們必須修正連線字串的值,把 unicode=True 移除即可。
後記:很奇妙,為什麼在測試專案中,app.config 的連線字串有 unicode=True 就沒事,在 web.config 中就會出錯呢?我也不知道,查不出原因,但更有趣的事發生了,我想要重現錯誤訊息,於把我把 web.config 中的 unicode=True 又加回去,而且執行清除專案後,再重建專案,然後瀏覽網頁,結果竟然正常,沒有發生錯誤,實在是不清楚原因!但總之,非常確定 Oracle.DataAccess 的連線字串是不支援 unicode=True,所以拿掉一定是對的。
算是一種bug 的know-how,
似乎 微軟產品 總要搞些小手段,來不相容 oracle.
發時間搞這種不得不搞的事情,真是很浪費生命。
這個ORM沒有其他語言的版本嗎?例如它收買來的java版,可能原生支持,問題比較少吧。
就我所知,Telerik OpenAccess ORM 沒有 java 版本。
至於資料來源,它支援很多資料庫,但我目前只有把他應用在 Oracle 上,所以不清楚其他資料庫的 Provider 有沒有這問題。