Quantcast
Channel: 黑暗執行緒
Viewing all articles
Browse latest Browse all 2311

Managed ODP.NET簡介

$
0
0

Oracle Client版本問題困擾過很多次,之前由網友回饋得知Managed ODP.NET,一直沒深入研究過,直到今天完成評估,新武器一枚入手。

過去我們常用的Oracle.DataAccess(ODP.NET),骨子裡其實是走Unmanaged,得靠oci.dll那堆程式庫才能連上資料庫,因此安裝時必須一併安裝Oracle Client,而Unmanaged Oracle Client有32位元跟64位元之分,許多開發者還因此學會IIS Application Pool啟用32位元模式的技巧呢!加上Oracle.DataAccess.dll執行時需存取Oracle Client檔案,我還因此學會排除NTFS權限問題PATH環境變數等技巧,ODP.NET真的讓我成長好多… orz

由以上的血淚經驗,已足以說明Managed ODP.NET的長處:

  1. 不需要安裝龐大的Oracle Client,只用一個Oracle.ManagedDataAccess.dll就可搞定連線。
  2. 不必再為32位元跟64位元版本問題困擾,Oracle.ManagedDataAccess.dll的目標平台是Any CPU!(灑花)
    註:若程式啟用分散式交易,還需動用另一顆區分32及64版本的Oracle.ManagedDataAccessDTC.dll,但專案不需加入參照,Managed ODP.NET會自動載入正確版本

補充:除了Oracle.ManagedDataAccess.dll,若使用EF6+或Code First,專案需再多參照Oracle.ManagedDataAccess.EntityFramework.dll。

Managed ODP.NET可由Oracle官網下載取得,它被歸類為64-bit ODAC:

注意:Managed ODP.NET支援Entity Framework,但不提供設計階段支援,如果想在Visual Studio使用Entity Framework專案項目,仍須安裝32位元版ODAC with Oracle Developer Tools for Visual Studio,另一方面,開發者通常會用到SQL Plus或第三方Oracle資料庫工具,故開發環境仍會以ODAC 32位元為主,伺服器或大量部署的客戶端才是Managed ODP.NET展現威力的主戰場。

Managed版ODP.NET很小,只有2.53M,ZIP檔解壓縮可得到odp.net、network資料夾,readme.html安裝說明以及install_odpm.bat、uninstall_odpm.bat,為安裝及解除安裝批次檔。

一般會用install_odpm.bat c:\oracle both true安裝及註冊,install_odpm.bat有三個參數,第一個參數為安裝資料夾(將解壓縮內容複製到指定路徑再註冊),第二個參數為x86、x64、both三者擇一,第三個參數則決定是否要將元件加入GAC及在machine.config加入設定,如果要執行Entity Framework,請選true。

安裝動作很單純,下完指令瞬間完成,跟Unmanaged ODP.NET的安裝相比,是高鐵 vs 牛車的差別。

安裝完成後,下一步是換上作業環境專用的資料庫名稱設定檔,在本例中,TNSNAMES.ORA預設放在c:\oracle\network\admin\目錄。

要使用Managed ODP.NET時,專案必須做些修改,將Oracle.DataAccess參照改成Oracle.ManagedDataAccess,但OracleConnection、OracleCommand等用法都相同,程式碼幾乎[註]不需更動。(註:Managed ODP.NET與Unmanaged ODP.NET仍存在些許差異,不過依文件所列項目,我手上的程式應該都不用修改)

使用Visual Studio開發的專案,改用Managed ODP.NET的捷徑是透過NuGet下載:(該程式套件由Oracle官方提供,可安心服用)

前面提到,實務上Visual Studio開發機器多已安裝32位元ODAC(否則無法在專案中設計及修改Entity Framework模型),改由NuGet取得Managed ODP.NET後,取得TNS名稱的方式跟Unmanaged ODP.NET有所不同,傳統ODP.NET主要依賴Registry設定,而Managed ODP.NET則有自己解析TNS名稱的順序:參考

  1. .NET config裡dataSources區塊裡的設定(資料庫別名設定可以直接寫在config裡,如此連TNSNAMES.ORA都不需要)
  2. 由.NET config檔TNS_ADMIN設定所指路徑找到TNSNAMES.ORA
  3. EXE檔所在目錄下的TNSNAMES.ORA
  4. 環境變數%TNS_ADMIN%路徑下的TNSNAME.ORA
  5. 環境變數%ORACLE_HOME%\network\admin路徑下的TNSNAME.ORA

就這樣,只要一個Oracle.ManagedDataAccess.dll,就能連上Oracle,很棒吧?

【結論】

不需要安裝笨重的Oracle Client,不用擔心32位元跟64位元版本打架,.NET程式就能輕鬆連上Oracle資料庫,是Managed ODP.NET最大亮點。在伺服器只運行.NET程式或是要大量部署到客戶端的場合,改用Managed ODP.NET可大幅簡化Oracle Client部署作業,是很不錯的選擇!

【2015-04-01更新】

感謝同事Jean補充目前改用Managed ODP.NET可能欠缺的功能:(但未來應會陸續補上)

  1. XML相關功能
  2. 不支援的OracleDbType:XmlType、Array、Boolean、Object、Ref
  3. OracleAdvanceQueue(罕用)
  4. OracleBulkCopy

Viewing all articles
Browse latest Browse all 2311

Trending Articles