.net中使用ODP.net訪問Oracle資料庫(無用戶端部署方法)

來源:互聯網
上載者:User

標籤:

 ODP.net是Oracle提供的資料庫訪問類庫,其功能和效率上都有所保證,它還有一個非常方便特性:在用戶端上,可以不用安裝Oracle用戶端,直接拷貝即可使用。

以下內容轉載自:http://blog.ywxyn.com/index.php/archives/326

由於微軟在.net framework4中會將System.Data.OracleClient.dll deprecated,而且就訪問效率和速度而言,System.Data.OracleClient.dll與Oracle.DataAccess.dll相比,微軟的確實沒有oracle提供的類庫有優勢,所以我放棄了使用多年的System.Data.OracleClient.dll,取而代之的是odp.net。然而odp.net的優點不止這些,還包括:

1、不在安裝用戶端也能訪問伺服器上的oracle(假設Application Server與DB Server 分開)

2、不需要配置TnsNames.Ora檔案

當然,我選擇odp.net的最主要的原因還是效能。這篇文章列舉了兩者之間的對比。Technical Comparison: ODP.NET Versus Microsoft OracleClient

下面我將介紹如何在一個在新的項目中使用odp.net。環境配置:A機器,運行C#程式,沒有安裝oracle資料庫或者用戶端等任何oracle的產品;B機器就運行著一個oracle9i資料庫,再沒安裝過其它oracle產品

首先要下載odp.net檔案,可以在這個頁面下載Oracle Data Access Components (ODAC) Downloads,我下載的是Oracle 11g ODAC 11.1.0.7.20 with Oracle Developer Tools for Visual Studio這個版本。

下載完成之後不用安裝,將Oracle.DataAccess.dll檔案從 ODTwithODAC1110720.zip\stage\Components\oracle.ntoledb.odp_net_2\11.1.0.7.10\1\DataFiles\filegroup4.jar檔案中解壓出來就行,然後複製到項目中,再添加引用Oracle.DataAccess.dll。
編寫如下代碼:

 1 using System; 2 using Oracle.DataAccess.Client; 3  4 namespace NoOraClient 5 { 6     class Program 7     { 8         static void Main(string[] args) 9         {10             //You need to enter a valid Oracle connection string, below is the format11             string connectionString = "user id=USERID;password=PASSWORD;" +12                 "data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=IPorSERVERNAME)" +13                 "(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ValidSID)))";14 15             using (OracleConnection connection = new OracleConnection())16             {17                 connection.ConnectionString = connectionString;18 19                 try20                 {21                     connection.Open();22                     Console.WriteLine("Connection Successful!");23                     Console.ReadLine();  // stops the console from closing until you hit the ENTER key24                 }25                 catch (OracleException ex)26                 {27                     Console.WriteLine(ex.ToString());28                     Console.ReadLine();  // stops the console from closing until you hit the ENTER key29                 }30             }            31         }32     }33 }

 



代碼編寫好以後,還要從下載的壓縮包中取出幾個dll檔案。

1、oci.dll (在jar檔案裡面叫’oci.dll.dbl’,拿出來之後去掉.dbl in ODTwithODAC1110720.zip/stage/Components/ oracle.rdbms.rsf.ic/11.1.0.7.0/1/DataFiles/filegroup2.jar)
2、oraociicus11.dll (inODTwithODAC1110720.zip/stage/Components/ oracle.rdbms.ic/11.1.0.7.0/1/DataFiles/filegroup3.jar)
3、OraOps11w.dll (inODTwithODAC1110720.zip/stage/Components/ oracle.ntoledb.odp_net_2/11.1.0.7.10/1/DataFiles/filegroup3.jar)

下面這三個有人說需要,有人說不需要,反正也不差這三個,繼續吧:
4、orannzsbb11.dll (inODTwithODAC1110720.zip/stage/Components/oracle.ldap.rsf.ic/11.1.0.7.0/1/DataFiles/filegroup1.jar)
5、oraocci11.dll (in ODTwithODAC1110720.zip/stage/Components/ oracle.rdbms.rsf.ic/11.1.0.7.0/1/DataFiles/filegroup3.jar)
6、ociw32.dll (在jar檔案裡面叫’ociw32.dll.dbl’,拿出來之後去掉.dbl inODTwithODAC1110720.zip/stage/Components/oracle.rdbms.rsf.ic/11.1.0.7.0/1/DataFiles/filegroup2.jar)
最後把這個DLL複製到項目中,CS的要與exe一個檔案夾,B/S的有專門的bin目錄。

當然,使用一項新技術,必然會遇到一些錯誤:以下是我遇到的:

1、啟動並執行時候遇到這個異常提示’The provider is not compatible with the version of Oracle client’,不要緊張,檢查一下上面所用到的dll是否齊全就OK。

2、“找不到請求的 .Net Framework 資料提供者。可能沒有安裝。”這個錯誤提示是因為在machine.config中找不到Oracle.DataAccess.dll,將下面的代碼放到

<DbProviderFactories></DbProviderFactories&gt;

之間就OK。

<add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342" /&gt;

註:如果下載的不是ODTwithODAC1110720,有可能dll的位置不像是上面提到的那樣,需要自己去挨個找了:(

以上為基本的使用方法,還有幾點要注意的地方(部分內容轉載自 http://alderprogs.blogspot.com/2009/04/deploying-odpnet-with-oracle-instant.html):

1:在上面列出的DLL中,其中Oracle.DataAccess.dll和OraOps11w.dll才是ODP.net對應的檔案,其餘的DLL均為OracleInstantClient對應的檔案,ODP.net和InstantClient的版本必須一致,否則會發生錯誤,只要能保證版本正確,可以視需求另外下載OracleInstantClient(因為InstantClient分幾個版本,BASIC,BASIC_LITE等),再將這幾個DLL檔案替換

2:各版本的ODTwithODAC包,其DLL位置都不相同,在新版本的包中,上面列出的DLL中,有些DLL已經去掉了(比如orannzsbb11.dll),而且Oracle.DataAccess.dll也根據.net的版本分為多個(以ODTwithODAC112030為例,其中包含2.x和4.0兩個版本,分別對應vs2005與2010,開發時需要取用對應的包),使用時注意所取的DLL檔案是否正確

3:對於連接字串,上文中使用的是:

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.100)(PORT=1527))(CONNECT_DATA=(SID=orcl)))
這個是比較典型的tnsname寫法,除了這種寫法外,ODP.net還支援將資料來源簡單地寫為:[//]host[:port][/service_name]

例如,上文中的例子即可寫成Data Souce=192.168.0.100:1527/orcl

此外,在這裡也同樣可以引用tnsnames.ora中配置好的串連(在本機裝有Oracle的前提下),有兩個方法:直接在程式中設定環境變數TNS_ADMIN,將其指向network\admin,或設定環境變數ORACLE_HOME,程式會自動去 %ORACLE_HOME%\network\admin下尋找tnsnames.ora

4:進行資料庫連接和查詢修改之前,有一些環境變數的設定可能會影響到程式的運行結果,同時,如果本機以前已經安裝過Oracle,它的一些設定也會影響到程式的運行,所以,在程式開啟串連之前,可以視情況適當選用下面的一些環境變數,來保證程式運行結果的正確(注意這部分是從英文資料中轉載過來的,有部分變數值對於中文環境來說可能會出現問題,請酌情修改)

.net中使用ODP.net訪問Oracle資料庫(無用戶端部署方法)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.