標籤:可見 效能 driver 選項 aac factor drive 1.2 dll
在.NET平台下開發Oracle應用的小夥伴們肯定都知道一方面做Oracle開發和實施相比SqlServer要安裝Oracle用戶端(XCopy、自己提取相關檔案也有一定複雜性),另一方面相比JAVA平台不如JDBC方便快捷,特別是一些剛接觸Oracle的小夥伴,面臨配置tns.ora、OraHome等等多少有些畏難情緒。
初始廬山
現在,這一切都即將成為過去啦。繼早些時候Oracle官方推出的ODP.NET Managed的Beta版之後,最近的版本已經跟隨12c一起發布了,可以 DLL http://pan.baidu.com/s/1boDID4N 下載。對應的粗看一下,下載了64bit的版本,下載完成後檔案不多。
一個readme.htm中只寥寥數語,熟悉的network檔案夾相當於與一個tnsnames和sqlnet的模板,managed裡也提供裡一個文檔,裡面描述也很少,主要介紹一些配置和BUG情況,核心就在common裡面的Oracle.ManagedDataAccess.dll這個檔案了,Oracle.ManagedDataAccess.Client.Configuration.Section.xsd這個檔案一看就知道是提供給vs的xml編輯器提供智能提示的,接著裡面還區分了X64和X86的檔案夾,一方便主要是分散式交易的Oracle.ManagedDataAccessDTC.dll不同,另一個就是bat檔案裡相關命令不同了。
如果你對之前的ODP.NET的OraProvCfg已經比較熟悉的話,那麼configure.bat裡面的內容就很好理解了,這個批處理一共幹了這麼幾件事情,其中2、4、5其實並不是必須的:
1、將驅動對應db factory註冊以及添加configuration處理器,其實就是在machine.config裡增加<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />和<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.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />,這樣在接下來的開發和部署中才能識別Oracle.ManagedDataAccess.Client的驅動以及oracle.manageddataaccess.client的配置節點(其實如果在單獨的程式配置也是可以的,需要注意的是是否使用gac)
2、添加ODP.NET Managed的效能計數器(Performance Counter)
3、將Oracle.ManagedDataAccess.dll添加到GAC中
4、提供在VS開發環境下配置節點的智能提示,其實就是將之前提到的Oracle.ManagedDataAccess.Client.Configuration.Section.xsd拷貝到VS對應目錄下
5、添加日誌記錄
6、添加VS開發環境對Oracle.ManagedDataAccess.dll引用的支援
牛刀小試
VS建立一個項目,引用Oracle.ManagedDataAccess.dll,開始隨意碼幾行爛熟的入門級代碼…,可以看到,正如Orale自己描述的,跟以前的API差別很小,所不同的就是命名空間換成了using Oracle.ManagedDataAccess.Client;
1: OracleConnection con = new OracleConnection();
2: con.ConnectionString = "user id=his3;password=his3;data source=192.168.1.237/ORCL";
3: con.Open();
4:
5: OracleCommand cmd = new OracleCommand();
6: cmd.CommandType = System.Data.CommandType.Text;
7: cmd.CommandText = "select * from gy_yonghuxx";
8: cmd.Connection = con;
9:
10: OracleDataAdapter da = new OracleDataAdapter();
11: da.SelectCommand = cmd;
12: DataSet ds = new DataSet();
13: da.Fill(ds);
14:
15: con.Close();
16: da.Dispose();
17: cmd.Dispose();
18: con.Dispose();
眼力好的夥伴肯定能馬上發現ConnectionString的特殊之處,字元串連串有三種方式 :
a、tns alias:"user id=scott;password=tiger;data source=sales";在此具體的對應tns檔案是可以在config檔案中指定,比如我的machine.config給我預設了一個<setting name="tns_admin" value="d:\installsoft\oracle\odp.net_managed121010\odp.net\managed\x64\..\..\..\network\admin" />
b、Connect Descriptor:該種方式就是將tns配置的一段拿出來寫進去,相比c的有點在於可配置項全面
"user id=scott;password=tiger;data source=" + "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" + "(HOST=sales-server)(PORT=1521))(CONNECT_DATA="+ "(SERVICE_NAME=sales.us.acme.com)))"
c、Easy Connect Naming Method:PROTOCOL等一些選項好像就沒地方配置了
"user id=scott;password=tiger;data source=//sales-server:1521/sales.us.acme.com"
Entity Framework重構
對於已經開始或準備使用Entity Framework的項目(目前版本還不支援Code First),如果熟悉ADO.NET替換起來其實也很簡單,共有三點需要注意
1、設定檔裡的連接字串中provider=Oracle.DataAccess.Client;替換為provider=Oracle.ManagedDataAccess.Client;provider
2、對應實體檔案edmx中的Provider="Oracle.DataAccess.Client"也替換為Provider="Oracle.ManagedDataAccess.Client"
3、如果對資料類型映射做過配置(Oracle預設的類型映射有點坑爹),需要將紅線下面的加上去
一探究竟
效能測試我想正式版發布前Oracle官方肯定做過的,自己做測試對比畢竟不夠專業,但粗略看下內部實現多少能看出端倪的,如果看過以前Oracle驅動的dll(Mircrosoft、Oracle、Devert提供的dll)肯定知道以前都是依賴於oci.dll這個介面,調用的最終實現是通過P\Invoke。是順著OracleConnect.Open最後跟蹤到的OracleCommunication的類,在此已經出現了soket、socketStream等對象,可見這次的託管版本託管的還是比較徹底的,個人覺得在效能上應該會比P\Invoke來的高效。
DLL下載:
C# 串連Oracle ,免安裝用戶端