OpenAccess for Oracle 的資料提供者以及組態檔的連線字串

  • 2558
  • 0

OpenAccess for Oracle 的資料提供者以及組態檔的連線字串

DotBlogs Tags: , , ,

本篇文章是快速入門的番外篇,因為不見得大家都會遇到這個問題,不過遇上了,就很難搞,為了節省大家時間,還是簡單分享一下解決辦法。

---------------

各位還記得一開始我們設定的 Oracle 資料提供者是誰嗎?下圖幫大家回憶一下:

2133342

我們一開始選的其實是 .Net Framework Data Provider for Oracle,也就是 OracleClient,但真正記錄在組態檔中的資料連線提供者,其實已被置換為 Oracle.DataAccess.Client 了,所以才會透過 Oracle.DataAccess 存取 Oracle 資料庫。

現在我們看看 OpenAccessWebApp01Model 專案中,app.config 的連線字串:

1337352

所以,還記得『OpenAccess快速入門01』那篇文章有一個錯誤畫面嗎:

2147342

指的就是找不到組態檔中所設定的資料提供者『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,就會出現這樣的錯誤:

2213535_thumb

解法就是重新安裝 Oracle Client,或執行 XCopy 的 install.bat。

關於 ODP.Net 的連線字串

其實 app.config 中的連線字串並不正確!沒想到吧,我發現時也是大錯愕,因為目前為止,我們透過測試專案調用 Model 專案時,並沒有發生問題。那什麼時候會發生問題?設定到 Web 專案的 web.config 時,執行時期就會發生問題了:

132439

查了 Oracle 官方的說明才知道:

Connecting to Oracle Database

根本就沒有「unicode=True」啊,所以其實我們必須修正連線字串的值,把 unicode=True 移除即可。

後記:很奇妙,為什麼在測試專案中,app.config 的連線字串有 unicode=True 就沒事,在 web.config 中就會出錯呢?我也不知道,查不出原因,但更有趣的事發生了,我想要重現錯誤訊息,於把我把 web.config 中的 unicode=True 又加回去,而且執行清除專案後,再重建專案,然後瀏覽網頁,結果竟然正常,沒有發生錯誤,實在是不清楚原因!但總之,非常確定 Oracle.DataAccess 的連線字串是不支援 unicode=True,所以拿掉一定是對的。

--------
沒什麼特別的~
不過是一些筆記而已