簡單的概述
ODP.NET的含義是 Oracle Data Provider for .NET的簡寫。
簡單的使用
下面的例子是一個簡單的C#命令行程序,它實現了最基本簡單的使用ODP訪問Oracle數據的功能。
///使用非托管代碼工具訪問,此方法與引用System.Data.OracleClient非常相似,但是性能要比后者好很多。
using System;
using Oracle.DataAccess.Client;
class Sample
{
static void Main()
{
// Connect to Oracle
string constr = "User Id=scott;Password=tiger;Data Source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();
// Display Version Number
Console.WriteLine("Connected to Oracle " + con.ServerVersion);
// Close and Dispose OracleConnection
con.Close();
con.Dispose();
}
}
///這是使用非托管代碼的訪問,可以編譯成anycpu的目標平台。
using System;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
namespace Connect
{
class Program
{
static void Main(string[] args)
{
try
{
// Please replace the connection string attribute settings
string constr = "user id=scott;password=tiger;data source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();
Console.WriteLine("Connected to Oracle Database {0}", con.ServerVersion);
con.Dispose();
Console.WriteLine("Press RETURN to exit.");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Error : {0}", ex);
}
}
}
}
非托管系統要求
- 操作系統
- 32位WINDOWS7+的系統
- 可以使用
32-BIT ODP.NET
- 可以使用
- 64位WINDOWS7+系統
- 可以使用
32-BIT ODP.NET或者64-BIT ODP.NET
- 可以使用
- 32位WINDOWS7+的系統
- .NET版本
- ODP.NET FOR .NET2.0只能在.NET 3.5SP1+上使用
- ODP.NET FOR .NET4.0 只能在.NET4.0 4.5 4.5.1 4.5.2 4.6(目前測試了這些)上使用
- ORACLE
- 服務器軟件版本:oracle10g release2 +
- 客戶端(Oracle Client)12.1[注:此軟件將會隨着ODP.NET一起安裝,如果你下載了ODP.NET之后執行安裝的話]
托管驅動系統要求
- 操作系統,與非托管相同,操作系統位數不受限制,可以編譯成AnyCpu,在32位和64位平台上自動選擇執行。
- .NET版本,目前只有4.0版本,與非托管的4.0版本要求相同
- ORACLE,與非托管相同
其它的注意事項
- 使用了
自動提升事務和分布式事務的應用程序,需要安裝Oracle Services for Microsoft Transaction Server 12.1,ODP.NET只為分布式事務提供讀寫隔離級別(隔離級別)的支持。- 非托管驅動需要
Oracle Services for Microsoft Transaction Server來支持獲取、提交、恢復的服務 - 托管驅動只需要
Oracle Services for Microsoft Transaction Server來支持恢復的服務,獲取和提交的服務已經由托管驅動提供。
- 非托管驅動需要
ENTITY FRAMEWORK(以下簡稱EF)系統要求
實現EF的db first、Model First要求:
- ODP.NET 11.2.0.3以上
- .NET 4.0+
如果要使用vs的工具,需要使用vs2010以上肯安裝Oracle Developer Tools for Visual Studio。
ODP.NET版本說明
從11.2.0.1.2開始,ODP.NET非托管驅動包含兩個DLL集合,一個支持.NET2.0一個支持.NET4.0以上,托管驅動則只支持.NET 4.0及以上。
安裝ODP.NET
安裝非托管驅動
- ODP.NET其實也是ODAC的一部分,ODAC可以從ORACLE官網下載,從ODAC11.1.0.6.20開始,ODP.NET可以通過XCOPY或者安裝器來安裝。
- XCopy
- 管理員通常使用XCopy來為為數眾多的機器部署ODP.NET。在安裝和配置期間,XCopy顯得比安裝器要小而且透明。
- 使用安裝器安裝
- 開發者或者管理員使用oracle通用安裝器來自動安裝ODP.NET,它包含了XCopy中所沒有的文檔和示例代碼。
- XCopy
使用安裝器安裝(OUI)
在安裝的時候,ODP.NET的動態幫助會自動安裝到vs中,以支持在線幫助。通過動態幫助功能,用戶可以通過F1來時刻獲得Oracle的幫助以及查詢相關文檔。
ODP.NET會在machine.
config文件中創建一個對象,來使得所有的應用可以使用oracleClientFactory類,這也同時讓DbProviderFactories類識另ODP.NET。
ODP.NET非托管驅動的EF6和CodeFirst功能,可以通過NuGet來獲得,OUI和XCOPY也包含了這些包,但是,需要一些外加的配置步驟。NUGET會自動完成這些步驟[除了連接字符串的設置,大哥這個你也不願意讓它設置吧]。
安裝完成以后,我們可以在ORACLE_BASE\ORACLE_HOME\odp.net\bin\找到我們安裝的東西,而且,當前的GAC中會被添加ODP.NET的DLL,這保證了以前的應用程序也可以隨便使用更新過的ODP.NET。當然,如果不想這樣,則應該去GAC中將這些DLL移除。
XCOPY的安裝方式
安裝前需知:
-
確保zip中的所有文件都沒有被OUI安裝過
-
在完成文件的解壓后,此產品必須立即進行安裝然后使用install_odpm.bat來配置
安裝步驟:
1、下載ODP.NET的托管zip包。
2、解壓zip包,並將其放至你想要安裝的地方(注意,它將永遠待在那里,我們稱為base目錄),base目錄中出現兩個文件夾,ODP.NET是放非托管驅動文件的;network是放ORA文件的。
4、執行Instal_odpm.bat來安裝和配置ODP.NET托管驅動:注意:請使用管理員權限來運行odpm文件
dopm語法:install_dopm.bat Oracle主目錄 目標平台 機器范圍配置
目標平台:X86,X64,或者兩個都寫,即both.
機器范圍配置:true或者false.
如果機器位寬配置選擇了true,則會將驅動添加到GAC中。如果選擇false,那么將不會修改MACHINE.CONFIG(修改MACHINE.CONFIG的作用是將驅動添加到GAC)。
如果dll未引用至GAC,那么需要在應用程序的CONFIG的文件中進行相關的配置(包括:configSections,DbproviderFactories以及Provider的具體的相關配置等),應用程序才可以使用ODP.NET。同時,此情況下,由於新的ODP.NET更新,必須要手動修改應用程序的bin目錄中的DLL文件。
托管驅動卸載
在base目錄中執行uninstall_odpm.bat文件,參數與安裝時執行install_odpm.bat相同.
非托管驅動綠色配置
安裝完成以后,我們發現,在machine.config中多出了如下的配置
<configSections>
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
<system.data>
<DbProviderFactories>
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="D:\Green\oracle11x86" />
<setting name="TraceOption" value="1"/>
<setting name="PerformanceCounters" value="0" />
</settings>
</version>
</oracle.manageddataaccess.client>
我們只需要在我們的應用程序config文件中加入以上配置,然后引用Oracle.ManagedDataAccess.dll這個文件。
需要注意的是,通過此方法可以配置TNS_ADMIN路徑,即TNS文件所在的目錄
TNS解析的時候尋找的規則是:
1、在oracle.manageddataaccess。client\dataSources\dataSource的alieas屬性相等的節點的descriptor屬性值。
2、在.NET CONFIG配置中name為TNS_ADMIN的settings的值所指定的目錄中尋找tnsnames.ora文件。
3、在.exe文件所在的目錄中尋找tnsnames.ora文件。
4、由系統環境變量所指定的變量TNS_ADMIN所指定的目錄中尋找tnsnames.ora文件(由測試發現,未找到官方說明)。
**需要特別說明的是:在IIS承載的web系統中,如果在系統環境變量中設置了TNS_ADMIN變量,那么,必須要在應用程序池中設置這個應用程序池的屬性“是否允許加載用戶配置”為true
補充:好多人在使用的時候,會發現,帶參數的請求有時候可以正確執行,有時候不可以,經過查詢,終於找到了答案:
問題源於System.Data.OracleClient中,默認綁定的變量是按照名稱來綁定的,而在ODP中,則默認是按照順序來綁定的,所以,出現參數匹配錯亂的情況,這里,只需要給Command.BindByName = true;即可。
