雖然oracle,sqlserver都是關係型資料庫,sql語句大部分也差不多,但是從sqlserver換到oracle還是有很多不適應的地方,本文旨在協助廣大初次接觸oracle的.net程式員快速上手。
一、安裝oracle 11g 服務端(可選)
1.1 為什麼要安裝服務端?理論上講,本機只需要安裝oracle用戶端即可,但是很多時候本機有一個服務端學習起來會更方便。比如:資料庫的匯入/匯出,資料庫的建立等,均需要服務端。註:oracle的server真的很占記憶體,如果您的愛姬記憶體在2G以下,建議直接跳過本步驟吧.
1.2 服務端的安裝檔案http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html因為我的筆記本是Win2008 R2系統,所以選擇了特定的win2008 x64版本(安裝檔案約1.9G),如下http://www.oracle.com/technetwork/database/enterprise-edition/downloads/111070-win64-2008soft-084715.html在win200 r2上安裝時,會提示作業系統不滿足安裝要求,如:不用理會,直接把問題項前面的複選框勾上,然後就能進入下一步繼續安裝了。安裝完成的最後一個介面上,在口令管理裡,最好把scott帳號解除鎖定(這是學習oracle的經典帳號,很多樣本教程都是用這個帳號串連的,其預設密碼是tiger)
1.3 如何測試服務端是否安裝正確了先開啟Net Manager展開服務命名點擊左側“紅色叉”按鈕下的表徵圖如果提示測試成功,則表示server端運行正常了。
二、安裝for .Net特定的用戶端 ODAC with Oracle Developer Tools for Visual Studio這是oracle官方推出的for .net的串連用戶端,效能優於微軟內建的System.Data.OracleClient下的東東,也是目前綜合效能最好的.net用戶端
http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html一路Next即可,如果提示作業系統不滿足要求,參考前面安裝服務端時的處理
三、安裝pl/sql developeroracle安裝完成後,內建了一個叫sql plus的查詢工具,相當於sqlserver中的查詢分析器,能用它練習sql,但是這個東東功能太弱,實在是難用。所以推薦大家用第三方的pl/sql developer,百度一下就能找到和註冊碼。這個軟體第一次啟動的介面如下:
但是如果輸入scott/tiger@orcl,並不能正確串連
因為我們還沒有配置tnsnames.ora檔案(這個可以理解為web.config或machine.config,用於儲存本機oracle client端的所有串連資訊,只有正確配置以後,oracle client才能正確串連oracle db server)進入 %oracle_home%\Network\Admin\Sample(注:%oracle_home%指oracle用戶端安裝後的根目錄) 找到tnsnames.ora檔案,把它複製到%oracle_home%\Network\Admin\下用記事本開啟,參照下面修改:# Every line that begins with # is a comment line
#
# Create Oracle net service names, or aliases, for each database server
# you need to connect to.
#
# TNSNames.ora sample entry
#
# alias =
# (DESCRIPTION =
# (ADDRESS = (PROTOCOL = TCP)(HOST = myserver.mycompany.com)(PORT = 1521))
# (CONNECT_DATA =
# (SERVER = DEDICATED)
# (SERVICE_NAME = orcl)
# )
# )
#
# You can modify the entry below for your own database.
# <data source alias> = Name to use in the connection string Data Source
# <hostname or IP> = name or IP of the database server machine
# <port> = database server machine port to use
# <database service name> = name of the database service on the serverlocal =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
解釋一下:local是自己定義的名稱,可以隨便改,只要不重複就行了,host後面的部分是伺服器ip地址,port是連接埠號碼,SERVICE_NAME是oracle server安裝時的執行個體命名,修改完成後,儲存。再次開啟pl/sql,會發現database下拉框裡多出了一個local,如:使用者名稱輸入scott,密碼輸入tiger,選擇local,登入,成功!
三、.net與oracle的串連這是初學者最頭痛的問題,oracle有4種方式可供.net串連3.1 古老的ODBC資料來源串連先開啟"Microsoft ODBC管理員",如
會看到設定介面
在vs2010的server explorer面板中,建立一個connection選擇Change,再選擇ODBC資料來源接下來的事情,大家照提示來就行了,不過我測試發現,ODBC方式在vs.net 2010/win2008 r2下,始終串連不上,但是在控制台的資料來源裡,test connection是成功的。箇中原因,也許只有微軟知道,所以這種方式我是沒實踐成功,放棄!反正odbc這種老古董我也不喜歡。3.2 微軟內建的System.Data.OracleClient同樣,server explorer面板中,add 一個connection,在出來的介面中,選擇change,切換成輸入使用者名稱和密碼後,就能串連成功。特別提醒:自從oracle官方推出for .net的用戶端後,微軟就宣告在未來的.net版本中,將移除System.Data.OracleClient命名空間,不再提供微軟版的oracle client! 詳情見:http://go.microsoft.com/fwlink/?LinkID=144260除非你的項目將來不打算升級,否則不建議大家用這種方式。為了引用System.Data.OracleClient,需要添加對System.Data.OracleClient.dll的引用,預設是在C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0目錄下添加引用成功後,就能用下面的代碼進行查詢了:
using System;using System.Data.OracleClient;namespace Sample{ class Program { static void Main(string[] args) { string connString = "Data Source=local;Persist Security Info=True;User ID=scott;Password=tiger;Unicode=True"; using (OracleConnection conn = new OracleConnection(connString)) { OracleCommand cmd = new OracleCommand("select * from emp", conn); conn.Open(); OracleDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Console.WriteLine("{0}\t{1}", dr[0].ToString(), dr[1].ToString()); } dr.Close(); } Console.ReadLine(); } }}
3.3 oledb方式連接字串為
Provider=MSDAORA;Data Source=local;Persist Security Info=True;User ID=scott;Password=tiger範例程式碼:
using System;using System.Data.OleDb;namespace Sample{ class Program { static void Main(string[] args) { string connString = "Provider=MSDAORA;Data Source=local;Persist Security Info=True;User ID=scott;PassWord=tiger"; using (OleDbConnection conn = new OleDbConnection(connString)) { OleDbCommand cmd = new OleDbCommand("select * from emp", conn); conn.Open(); OleDbDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Console.WriteLine("{0}\t{1}", dr[0], dr[1]); } dr.Close(); } Console.ReadLine(); } }}
3.4 Oracle官方的ODP.Net連接字串為 DATA SOURCE=local;PERSIST SECURITY INFO=True;USER ID=SCOTT;Password=tiger要使用ODP.Net,必須先添加對Oracle.DataAccess.dll的引用,該檔案位於%Oracle_Home%\11.2.0\odp.net\bin\4下範例程式碼如下:
using System;using Oracle.DataAccess.Client;using System.Data;using System.Data.Common;namespace Sample{ class Program { static void Main(string[] args) { string connString = "DATA SOURCE=local;PERSIST SECURITY INFO=True;USER ID=SCOTT;Password=tiger"; string ProviderName = "Oracle.DataAccess.Client"; DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); using (DbConnection conn = factory.CreateConnection()) { conn.ConnectionString = connString; conn.Open(); DbCommand cmd = conn.CreateCommand(); cmd.CommandText = "select * from emp"; cmd.CommandType = CommandType.Text; DbDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { Console.WriteLine("{0}\t{1}", dr[0], dr[1]); } dr.Close(); } Console.ReadLine(); } }}
為了測試這三種方式(ODBC不考慮)的效能,簡單寫了一段代碼測試了一下:
using System;using Oracle.DataAccess.Client;using System.Data;using System.Data.OleDb;using System.Data.Common;using System.Diagnostics;using MSOracle = System.Data.OracleClient;namespace Sample{ class Program { static void Main(string[] args) { string temp = ""; string connString = "DATA SOURCE=local;PERSIST SECURITY INFO=True;USER ID=SCOTT;Password=tiger"; string ProviderName = "Oracle.DataAccess.Client"; DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); int max = 5000; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < max; i++) { using (DbConnection conn = factory.CreateConnection()) { conn.ConnectionString = connString; conn.Open(); DbCommand cmd = conn.CreateCommand(); cmd.CommandText = "select * from emp"; cmd.CommandType = CommandType.Text; DbDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { //Console.WriteLine("{0}\t{1}", dr[0], dr[1]); temp = dr[0].ToString(); } dr.Close(); //Console.WriteLine("第{0}次\t----------------------------------------", i); } } sw.Stop(); Console.WriteLine("Oracle.DataAccess.Client\t{0}次耗時:{1}毫秒", max, sw.ElapsedMilliseconds); string connString2 = "Provider=MSDAORA;Data Source=local;Persist Security Info=True;User ID=scott;PassWord=tiger"; sw.Reset(); sw.Start(); for (int i = 0; i < max; i++) { using (OleDbConnection conn =new OleDbConnection(connString2)) { conn.Open(); OleDbCommand cmd = new OleDbCommand("select * from emp", conn); OleDbDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { //Console.WriteLine("{0}\t{1}", dr[0], dr[1]); temp = dr[0].ToString(); } dr.Close(); //Console.WriteLine("第{0}次\t----------------------------------------", i); } } sw.Stop(); Console.WriteLine("System.Data.OleDb\t{0}次耗時:{1}毫秒", max, sw.ElapsedMilliseconds); string connString3 = "Data Source=local;Persist Security Info=True;User ID=scott;Password=tiger;Unicode=True"; sw.Reset(); sw.Start(); for (int i = 0; i < max; i++) { using (MSOracle.OracleConnection conn = new MSOracle.OracleConnection(connString3)) { conn.Open(); MSOracle.OracleCommand cmd = new MSOracle.OracleCommand("select * from emp", conn); MSOracle.OracleDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { //Console.WriteLine("{0}\t{1}", dr[0], dr[1]); temp = dr[0].ToString(); } dr.Close(); //Console.WriteLine("第{0}次\t----------------------------------------", i); } } sw.Stop(); Console.WriteLine("System.Data.OracleClient\t{0}次耗時:{1}毫秒", max, sw.ElapsedMilliseconds); Console.ReadLine(); } }}
運行結果:
Oracle.DataAccess.Client 5000次耗時:4711毫秒
System.Data.OleDb 5000次耗時:53684毫秒
System.Data.OracleClient 5000次耗時:8436毫秒
相信大家知道如何選擇了吧,果然還是Oracle官方更熟悉自己的產品。