我只是一名普通的.Net開發人員,常用SqlServer,偶爾用其它資料庫,屬於能連上然後select/execute就行的那種。但就是我這麼小的願望,在面對Oracle時都很難實現。
雖然04年就開始用Oracle開發項目,但每次遇到問題總是胡亂弄一下,能用就行。這次又遇到問題,更離譜的是:同一個版本的NewLife.XCode,同一台機器,同一個ODP.Net版本,上個月寫的程式工作好好的,怎麼折騰都能用,剛剛新寫的一個,怎麼寫都不行!於是,決心徹底的解決這個問題,共耗時三天三夜(熬夜到淩晨一兩點)。
我們知道,用.Net連結Oracle資料庫,有兩個驅動,一個是.Net內建的,一個是Oracle開發的ODP.Net()(要註冊,後面提供一個我們團隊的)。而.Net內建那個,MS早就不支援不更新了,於是一般開發都會用ODP.Net。並且,.Net內建的驅動,必須用TNS方式串連資料庫,而不能用這種:
Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.34)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORC)));User ID=admin;Password=admin;
否則報錯:
串連選項“Data Source”的長度無效,最大長度為 128
開發支援Oracle的.Net程式,標準流程是先安裝Oracle用戶端,然後使用.Net內建驅動或者ODP.Net。其實只要按照這個流程來做,基本上不會有錯誤,要錯也只是TNS錯而已。而最令人忍受不了的就是,Oracle用戶端實在是無比龐大,儘管後來可以只安裝Oracle用戶端運行時,仍然很大。於是,就有高手製作精簡版用戶端,這個網上很多,效果也非常不錯。
當然啦,Oracle官方也沒閑著,推出了InstantClient,不到30M的msi安裝程式。總算是擺脫了那個巨大的用戶端。
但是,人的欲求是無止境的!有了更小的運行時,為了方便,我們還希望能做到免安裝,伴隨著我們開發的主程式拷貝過去就能用。經過多方求證,Oracle用戶端運行時的關鍵在於OCI,也就是說,不管用什麼語言寫的程式,只要能找到運行時的oci.dll,基本上就能連結Oracle資料庫了。
通過反編譯ODP.Net裡面的Oracle.DataAccess.dll發現,它會先找註冊表,然後是設定檔,從中找一些設定,第一個就是DllPath,我估計這個就是OCI的路徑。於是備份了InstantClient安裝後的檔案,然後把它卸載了,並確保註冊表沒有殘留。釋放備份的檔案,在項目設定檔裡面指定路徑:
實際上是增加一個段:
<configSections> <section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections>
然後再設定DllPath:
<oracle.dataaccess.client> <settings> <add name="DllPath" value="D:\Oracle\OCI" /> </settings></oracle.dataaccess.client>
讓測試代碼跑起來,一切正常!這說明,只要能找到oci.dll所在目錄,程式就可以正常工作。當然,如果把這個目錄的檔案直接放到軟體目錄中,也是可以使用的。
到這裡,習慣的想,只要把那些安裝後的檔案拷貝走,就可以使用了。但打包的時候才發現,InstantClient的安裝檔案雖然不到30M,但是安裝之後足足139M(實際上是最新的驅動2.112.2.0,網上的InstantClient是2.112.1.0,兩者檔案基本一樣):
圖中可以看到,罪魁禍首是oraociei11.dll這個,它就佔了126M。上網搜尋各種Oracle用戶端精簡方案,必要的幾個檔案:
oci.dll、orannzsbb11.dll、oraocci11.dll、oraociei11.dll,它是必不可少的呀……
當然,還有兩個:Oracle.DataAccess.dll、OraOps11w.dll,有些安裝包會把OraOps11w.dll跟OCI放在一起,也是可以的。
傷不起呀!這幾個檔案就127M了,最高壓縮,也有30M,並且解壓還特別慢!(這個壓縮包後面提供下載)
難道除了這個就沒辦法更小了嗎?不是的!朋友告訴我一個很小的運行時oracle9i310(網上有扣積分下載,後面提供本地下載),才13M,不過需要安裝。
但是這個運行時比較難纏,如果用最新的Oracle.DataAccess.dll去串連,會報版本不匹配!
(這裡插一段關於版本不相容的說明)
The provider is not compatible with the version of Oracle client
提供者與此版本的 Oracle 客戶機不相容
這個可是開發.Net For Oracle程式中最常見的錯誤了。
實際上,這是使用ODP.Net經常遇到的問題,在ODP.Net中,Oracle.DataAccess.dll=>OraOps11w.dll=>oci.dll,前面兩者的版本必須100%匹配(OraOps11w.dll裡面通過寫入程式碼寫死了的)(也許這就是Oracle官方把OraOps11w.dll跟Oracle.DataAccess.dll放在一起的原因)。後面兩者的版本似乎要求不高,是C++之間的引用。
而.Net的Oracle驅動,版本要求就非常低了,只要能找到oci.dll,基本上就能很好工作,它不會去檢查版本什麼的。如果找不到oci.dll呢,就會報這個錯誤:
System.Data.OracleClient 需要 Oracle 用戶端軟體 8.1.7 或更高版本。
當然,光有OCI目錄(在環境變數Path中設定)不行,還得設定環境變數ORACLE_HOME為OCI目錄,否則報錯(因為oci.dll要用別的dll):
OCIEnvCreate 失敗,傳回碼為 -1,但錯誤訊息文本不可用。
言歸正傳!
最新的ODP.Net驅動無法使用oracle9i310運行時,那麼試試MS的。設定環境變數ORACLE_HOME為oracle9i310目錄,在環境變數Path中添加其下的bin目錄(oci.dll在裡面)。測試正常!這表明,9i運行時支援綠色發布。
下一步,就應該是開始精簡這個oracle9i310了。
不到13M的安裝包,安裝後只有35M,遠遠比最新的ODP.Net驅動要小,壓縮後不到9M。
刪除一些不必要的東西後,剩下28M,壓縮得到6.5M。這應該算是最小的Oracle用戶端運行時了。
綜合比較:
|
.Net內建Oracle驅動 |
ODP.Net驅動 |
連接字串TNS寫法 |
支援 |
支援 |
連接字串非TNS寫法 |
不支援 |
支援 |
是否支援Oracle9運行時 |
支援 |
不支援 |
是否支援Oracle11運行時 |
支援 |
支援 |
OCI目錄設定方式 |
環境變數Path中設定 |
環境變數Path中設定 或 設定檔設定DllPath 或 註冊表設定DllPath |
其它環境變數 |
需要設定ORACLE_HOME |
無 |
運行時安裝包大小 |
9i運行時安裝包13M |
11g運行時安裝包30M 最新ODP.Net共52M |
綠色精簡後大小 |
9i運行時6.5M |
11g運行時30M |
據說的差別 |
效能底下,功能特性少 |
效能最高,功能特性多 |
|
|
|
:
Oracle9i用戶端運行時精簡版 6.5M
Oracle11g用戶端運行時精簡版 30M
Oracle9i用戶端運行時原版 13M
Oracle11g用戶端運行時原版 52M
(隨時可能變更,以最新群公告為準!)
FTP承受不了,增加網盤共用:
9i精簡版:http://www.kuaipan.cn/file/id_2378544298602218.html
11g精簡版:http://www.kuaipan.cn/file/id_2378544298602215.html
9i原版:http://www.kuaipan.cn/file/id_2378544298602216.html
11g原版:http://www.kuaipan.cn/file/id_2378544298602217.html
(FTP嚴重影響了伺服器網路,現在已經關閉)
後續:
Devart dotConnect for Oracle
在OneCool和小胖2010的推薦下,分析Devart。
1,採用名稱混淆,分析有一定難度
2,採用Lic授權,很脆弱
3,發現調用OCI.DLL,發現處理Home等環境變數,看來還是離不開oci.dll
綜評,跟ODP.Net比,沒有優勢,並且還是收費的(也有免費版)
DataDirect
在園友wizardwu的一篇部落格中發現了這個傢伙。
1,產品說明非常吸引人,唯一一個100%Managed 程式碼資料提供者,不需要Oracle OCI用戶端庫。對,這就是我們夢寐以求的!
2,最新版本是3.5,需要申請試用。上午10點,發動群友,採用各種國內外郵箱、IP、VPN申請,均無法收到郵件。下午3點收到,開始下載。
3,上午從CSDN找到一個2.1的版本(For .Net 1.0),未混淆,採用Lic授權,支援OEM,自寫的對稱式加密演算法,內建沒有任何處理的密碼,很脆弱
4,從2.1版本中很清楚的看到資料封包解包,網路發送和接收的過程。沒有見到任何跟OCI和HOME有關的東西。可以肯定,這是純Managed 程式碼且不需要OCI的。
5,下午分析3.5(For .Net 2.0/4.0),名稱混淆,也是Lic授權。看到類的布局,還有各個命名空間,不需要分析下去了。
綜評,沒錯,這就是我們所需要的極品,強烈推薦!!!沒找到價格,似乎必須跟他們聯絡。時間不多,沒有做運行測試,我想網上有很多報告的!
其中2.1版,關於Oracle、SqlServer、Sybase、DB2的封包,非常具有參考價值!
2.1版下載:http://www.kuaipan.cn/file/id_2378544298602742.html
3.5版下載:http://www.kuaipan.cn/file/id_2378544298602758.html