長期以來,我一直用的是 MS SQL Server / Access 資料庫,通過.NET 訪問MS自家的東西幾乎沒碰到過什麼麻煩。最近項目中要用 Oracle 作為資料庫,學習研究了一些 .NET 訪問Oracle 的東西,發現問題倒真的不少。
1。System.Data.OracleClient 和 System.Data.OleDb 命名空間
雖然通過這兩個命名空間的類都可以訪問 Oracle 資料庫,但和 SQL Server 類似的(System.Data.SqlClient 命名空間的類效率要比 System.Data.OleDb 命名空間中的類高一些),System.Data.OracleClient 命名空間中的類要比 System.Data.OleDb 命名空間的類效率高一些(這一點我沒有親自驗證,但大多數地方都會這麼說,而且既然專門為 Oracle 作的東西理論上也應該專門作過針對性的最佳化)。
當然還有另一點就是從針對性上說,System.Data.OracleClient 要更好一些:
比如資料類型,System.Data.OleDb.OleDbType 枚舉中所列的就沒有 System.Data.OracleClient.OracleType 枚舉中的那些有針對性;另外,Oracle 的Number 類型如果數字巨大,超出 .NET 資料類型範圍的情況中,就必須使用System.Data.OracleClient 中的專門類 -- OracleNumber 類型。
好了,不再贅述這兩個的比較,下面主要討論System.Data.OracleClient 命名空間中的類型,即 ADO.NET for Oracle Data Provider (資料提供者)。
2。資料庫連接:
無論是 System.Data.OleDb 還是 System.Data.OracleClient 訪問 Oracle 都需要在 .NET 啟動並執行機器(ASP.NET 中就是 Web 服務器)安裝 Oracle 用戶端組件。(這一點是和 MS 的兩種資料庫不同的,MS 的東西安裝 MDAC: Microsoft Data Access Component 2.6 以上版本後,就無須再安裝 SQL Server 用戶端或者 Office 軟體,就能訪問。)
System Requirements:
(1) 如用 System.Data.OracleClient 訪問 Oracle,用戶端組件版本應在 Oracle 8i Client Release 3 (8.1.7)以上版本。MS 只確保訪問 Oracle 8.1.6、Oracle 8.1.7、Oracle 9i 伺服器時的情況。MDAC 2.6 以上。
(2)如用 System.Data.OleDb 訪問 Oracle,用戶端組件版本 7.3.3.4.0 以上或 8.1.7.4.1 以上。MDAC 2.6 以上。
如伺服器為 Oracle8i 以上,用戶端組件版本應為 8.0.4.1.1c。
在 .NET 啟動並執行機器中,安裝 Oracle 用戶端,然後開啟 Net Manager (Oracle 9i) / Easy Config (Oracle 8i) 按你以前的經驗設定本地服務的映射(這裡的服務名將用於資料庫連接串)。
System.Data.OracleClient 中訪問 Oracle 資料庫的串連串是:
User ID=使用者名稱; Password=密碼; Data Source=服務名
(上述為一般的串連串,詳細的串連串項目可以在 System.Data.OracleClient.OracleConnection.ConnectionString 屬性的文檔中找到。)
System.Data.OleDb 中的訪問 Oracle 資料庫的串連串是:
Provider=MSDAORA.1; User ID=使用者名稱; Password=密碼; Data Source=服務名
關於訪問方式的總結
我在查看ORACLE網站、MSDN2005及註冊表之後,小有收穫,特寫此文,希望對各位有所協助。
好了,廢話結束,現在看本文:
1.ODBC方式
我們可以在 "我的電腦-> 控制台-> (效能和維護-> )管理工具-> 資料來源(ODBC)-> 系統DSN-> 添加 ",查看系統中已經安裝好的ODBC驅動,其中就包含了“Microsoft ODBC Driver for Oracle”。
所以,如果用ODBC方式來訪問ORACLE,可以不用安裝ORACLE CLIENT;
2.OLEDB方式
請大家開啟登錄編輯程式regedit,搜尋oracle即可以搜尋到以下鍵:
Microsoft OLE DB Provider for Oracle
HKEY_CLASSES_ROOT\CLSID\{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}\OLE DB Provider
HKEY_CLASSES_ROOT\MSDAORA
所以,只要你安裝了合適版本的MDAC,那麼起碼就已經可以使用OLEDB來訪問ORACLE了。
3.System.Data.OracleClient方式
以上2種都是比較通用的方式,我們再來看看M$專門為ORACLE寫的類。
請大家開啟MSDN2005,輸入地址
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs /WD_ADONET/html/054f76b9-1737-43f0-8160-84a00a387217.htm(您也可以通過目錄、索引或者搜尋 來找到)
《Oracle .NET Framework 資料提供者的系統要求》(即System.Data.OracleClient命名空間中的類),摘要如下:
Oracle .NET Framework 資料提供者需要 Microsoft 資料訪問組件 (MDAC) 2.6 版或更高版本。建議使用 MDAC 2.8 SP1。
還必須安裝 Oracle 8i Release 3 (8.1.7) 用戶端或更高版本。
Oracle 9i 版本之前的 Oracle 用戶端軟體無法訪問 UTF16 資料庫,因為 UTF16 是 Oracle 9i 中的一項新功能。要使用此功能,必須將用戶端軟體升級到 Oracle 9i 或更高版本。
哈哈,M$其實沒有我們想象中的勤奮,他只是幫ORACLE CLIENT做了個封裝而已。
4.Oracle Data Provider for .net(ODP.NET)
我們再到ORACLE的老家轉轉,可以發現他在很多地方都吹噓ODP.NET,看看它有些什麼要求才能用吧。
請大家在瀏覽器中輸入地址(ORACLE的網站有點慢,請不要急)
http://www.oracle.com/technology/tech/windows/odpnet/faq.html#install
Q: What do I need to have installed on my client machine to have ODP.NET work?
A: You will require the following:
Windows 2000, Windows XP Professional, or Windows Server 2003
Microsoft .NET Framework 1.0 or higher
Oracle9i Client Release 2 (9.2) or higher
Oracle Net Services (included with the client)
Oracle Services for Microsoft Transaction Server, Release 2 (9.2) or higher. This is required for applications using distributed transacations.
簡單翻譯:
如果你用ODP.NET來訪問ORACLE資料庫,你需要以下條件:
作業系統:WIN2K XP 2003
.NET FRAMEWORK 1.0以上
ORACLE9I以上的用戶端
5.第3方的觀點:
在 http://www.fawcette.com/vsm/2003_07/magazine/columns/databasedesign/
有一篇文章叫 < <Take Advantage of Oracle in .NET> >
講了如何在可視環境下(也就是用滑鼠點、拖等操作)訪問ORACLE 。
用的似乎就是OLE DB的方式。
好了,現在來做個總結。
同志們,回顧曆史,展望未來,我們要發揚XXXX,高舉YYYY(以下省略5000字)......
1.在不安裝ORACLE用戶端的情況下,可以用ODBC和OLEDB 2種方式來訪問ORACLE;
2.如果喜歡多往別人的機器裝東西,不怕麻煩,可以用“效能最好”(ORACLE網站這麼說的)的ODP.NET來訪問ORACLE;
3.如果用System.Data.OracleClient,可以稍微少裝點東西,不過比2的協助文檔更多,並且我們似乎都習慣使用微軟的東西。
4.推薦使用System.Data.OleDb中的類來訪問ORACLE,優點:(1)因為我懶,我不喜歡往別人和我自己的機器裡安裝過多的東西; (2)可以運行在WIN98以上的系統下,而2 3中的方式只能在WIN2K以上的系統下;(3)ODBC似乎太老了點,看來我是中庸派的人......(哎,老了 -_- )
好了,感謝您堅持看完本文,希望沒有浪費您的時間,對您有所協助。