.net中使用ODP.net訪問Oracle數據庫(無客戶端部署方法)

 

.net中使用ODP.net訪問Oracle數據庫(無客戶端部署方法)

分類: c# database
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的優勢不止這些,還包括:

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

二、不須要配置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。
編寫以下代碼:

using Oracle.DataAccess.Client;
...
string connstring =
  "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.100)(PORT=1527))" +
  "(CONNECT_DATA=(SID=orcl)));User Id=sys;Password=sys;";//這個也能夠放到Web.Config中。
using (OracleConnection conn = new OracleConnection(connstring))
{
  conn.Open();
  string sql = "select * from users";
  using (OracleCommand comm = new OracleCommand(sql, conn))
  {
    using (OracleDataReader rdr = comm.ExecuteReader())
    {
      while (rdr.Read())
      {
        Console.WriteLine(rdr.GetString(0));
      }
    }
  }
}

代碼編寫好之後,還要從下載的壓縮包中取出幾個dll文件。
一、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)
二、oraociicus11.dll (in ODTwithODAC1110720.zip\stage\Components\ oracle.rdbms.ic\11.1.0.7.0\1\DataFiles\filegroup3.jar)

三、OraOps11w.dll (in ODTwithODAC1110720.zip\stage\Components\ oracle.ntoledb.odp_net_2\11.1.0.7.10\1\DataFiles\filegroup3.jar)php

四、oraons.dll (in ODTwithODAC1110720.zip\stage\Components\ oracle.ons.ic\11.1.0.7.10\1\DataFiles\filegroup1.jar    ) html

下面這三個有人說須要,有人說不須要,反正也不差這三個,繼續吧: 五、orannzsbb11.dll (in ODTwithODAC1110720.zip\stage\Components\oracle.ldap.rsf.ic\11.1.0.7.0\1\DataFiles\filegroup1.jar) 六、oraocci11.dll (in ODTwithODAC1110720.zip\stage\Components\ oracle.rdbms.rsf.ic\11.1.0.7.0\1\DataFiles\filegroup3.jar) 七、ociw32.dll (在jar文件裏面叫’ociw32.dll.dbl’,拿出來以後去掉.dbl in ODTwithODAC1110720.zip\stage\Components\ oracle.rdbms.rsf.ic\11.1.0.7.0\1\DataFiles\filegroup2.jar) 最後把這個DLL複製到項目中,CS的要與exe一個文件夾,B/S的有專門的bin目錄。 固然,使用一項新技術,必然會遇到一些錯誤:如下是我遇到的: 一、運行的時候遇到這個異常提示’The provider is not compatible with the version of Oracle client’,沒關係張,檢查一下上面所用到的dll是否齊全就OK。 二、「找不到請求的 .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,它的一些設置也會影響到程序的運行,因此,在程序打開鏈接以前,能夠視狀況適當選用下面的一些環境變量,來保證程序運行結果的正確(注意這部分是從英文資料中轉載過來的,有部分變量值對於中文環境來講可能會出現問題,請酌情修改) Environment.SetEnvironmentVariable("ORA_TZFILE", null); Environment.SetEnvironmentVariable("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8"); Environment.SetEnvironmentVariable("NLS_DATE_FORMAT", "DD-MON-RR"); Environment.SetEnvironmentVariable("NLS_TIME_FORMAT", "HH.MI.SSXFF AM"); Environment.SetEnvironmentVariable("NLS_TIMESTAMP_FORMAT", "DD-MON-RR HH.MI.SSXFF AM"); Environment.SetEnvironmentVariable("NLS_TIMESTAMP_TZ_FORMAT", "DD-MON-RR HH.MI.SSXFF AM TZR");
相關文章
相關標籤/搜索