1,什么是ODF .NE,?就是Oracle 為 .NET (ODP.NET) 專門編寫了 Oracle Data Provider,一個用於 Microsoft .NET 環境下的 Oracle 數據訪問 API 。
詳細解說 http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html 對於官方的代碼,已不存在了!
ODP.NET你不需要安裝Oracle,不需要配置oracle.key文件,不需要配置TnsNames.Ora文件 不需要配置環境變量;完全的傻瓜式的在沒有安裝oracle數據庫或者
客戶端等任何oracle的產品的機器去訪問Oracle數據庫!
下面詳細解說ODP.NET如何對Oracle的數據操作【可以完成建表,CURD( 增刪查改)】
步驟一:獲取支持數據庫連接的類庫文件:Oracle.DataAccess.dll 如何獲取呢?
到官網去相應的版本http://www.oracle.com/technetwork/cn/topics/dotnet/index-088718-zhs.html
下載后安裝后會在你的安裝目錄\DP.NET\BIN\2.X(圖1)下出現這個Oracle.DataAccess.dll,把它復制到你的解決方案下 引用一下
圖1
順便點擊一下Oraprovcfg.exe 自動配置了環境變量(圖2)
圖2
成功獲取所要的dll文件,有些人還要去一個文件的去解壓,去配置,我看不需要,如需要的話這個是詳細的配置步驟
http://blog.csdn.net/Sunlihgt_love/article/details/5423926
步驟二:在正式使用之前,需要在項目中添加引用:
Oracle.DataAccess.Client 設置數據庫的連接等等通用功能,
Oracle.DataAccess.Types 設置 oracle自定義的一些數據類型
步驟三:實例解說
如提供以下數據庫的信息
數據庫服務器地址:192.168.10.20
庫名:44410g242
賬號:44bikll
密碼:487gf,.q
連接oracle的字符串就是這樣的(提供我測試的2種方式)
//string conString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.20)(PORT=1521))" +
//"(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = 44410g242)));User Id=44bikll;Password=487gf,.q;";
string conString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.20)(PORT=1521))" +
"(CONNECT_DATA=(SID=44410g242)));User Id=44bikll;Password=487gf,.q;";
//寫連接串以上2方法連接都可以,也可以放到Web.Config中。
以上的連接協議TCP和端口1521都是默認的 ,無需修改,如端口被占用了就需要改下。
本案例中涉及2個表TBLOCKLOG和TBACCOUNT

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; namespace DHH_Bill_TBLockLog { class Program { static void Main(string[] args) { #region 測試數據庫 Console.WriteLine("獲取testid031用戶在2013-4-11 15:53:40到2013-04-12 00:00:00的消費清單"); Console.WriteLine(); string conString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.20)(PORT=1521))" +
"(CONNECT_DATA=(SID=44410g242)));User Id=44bikll;Password=487gf,.q;"; //這個也可以放到Web.Config中。 //實例化OracleConnection對象
try { using (OracleConnection conn = new OracleConnection(conString)) { conn.Open(); string sql = "select TBACCOUNT.username,TBLOCKLOG.accountid,TBLOCKLOG.amount,TBLOCKLOG.locktime FROM TBLOCKLOG,TBACCOUNT WHERE TBLOCKLOG.accountid=TBACCOUNT.accountid "; sql += " and TBLOCKLOG.serviceid=1 and TBACCOUNT.username='testid031' and TBLOCKLOG.status=1 and TBLOCKLOG.locktime >= to_date('2013-4-11 13:53:40','yyyy-mm-dd hh24:mi:ss') and TBLOCKLOG.locktime <= to_date('2013-04-12 00:00:00','yyyy-mm-dd hh24:mi:ss') order by TBLOCKLOG.locktime"; using (OracleCommand comm = new OracleCommand(sql, conn)) { using (OracleDataReader rdr = comm.ExecuteReader()) { while (rdr.Read()) { Console.WriteLine("UserName:" + rdr.GetString(0) + ",UserId:" + rdr.GetInt32(1) + ",點數:" + rdr.GetInt32(2) + "," + rdr.GetDateTime(3)); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } #endregion Console.WriteLine(); Console.WriteLine(); Console.WriteLine("計算2013-4-11 15:53:40到2013-04-12 00:00:00時間的testid031用戶消費的amount的總和"); Console.WriteLine(GetBillByDateAndGameId(conString, "testid031", 1, Convert.ToDateTime("2013-4-11 13:53:40"), Convert.ToDateTime("2013-04-12 00:00:00"))); } public static int GetBillByDateAndGameId(string conString,string accountId, int gameId, DateTime beginTime, DateTime endTime) { try { using (OracleConnection conn = new OracleConnection(conString)) { accountId = accountId.ToLower();//全部轉換為小寫
conn.Open(); string sql = "select sum(TBLOCKLOG.amount) sumamount FROM TBLOCKLOG,TBACCOUNT WHERE TBLOCKLOG.accountid=TBACCOUNT.accountid "; sql += " and TBLOCKLOG.serviceid=" + gameId + " and TBACCOUNT.username='" + accountId + "' and TBLOCKLOG.status=1 and TBLOCKLOG.locktime >= to_date('" + beginTime + "','yyyy-mm-dd hh24:mi:ss') and TBLOCKLOG.locktime <= to_date('" + endTime + "','yyyy-mm-dd hh24:mi:ss') order by TBLOCKLOG.locktime"; using (OracleCommand comm = new OracleCommand(sql, conn)) { using (OracleDataReader rdr = comm.ExecuteReader())//創建一個OracleDateReader對象
{ int sum = 0; while (rdr.Read())//讀取數據,如果odr.Read()返回為false的話,就說明到記錄集的尾部了
{ if (rdr.GetOracleValue(0).ToString() == "null")//防止為空
{ sum = 0; } else { sum = int.Parse(rdr.GetOracleValue(0).ToString()); //sum = int.Parse(rdr[0].ToString());
} } return sum; } } } } catch (Exception ex) { return -1; } } } }
顯示結果:
以下是: 1. 建立數據庫
建立一個名為OracleTypesTable的表
"create table OracleTypesTable (MyVarchar2 varchar2(3000),MyNumber number(28,4) Primary key ,MyDate date,MyRaw RAW(255))";
插入一行數據
"insert into OracleTypesTable values ('test',4,to_date('2000-01-11
12:54:01','yyyy-mm-dd hh24:mi:ss'),'0001020304')";
其他操作的說明:(使用說明:http://www.oracle.com/technetwork/cn/testcontent/o23odp-084525-zhs.html)
注意:
1,案例中的sql語句還是和mssql有一點區別的;
2,統計的話如果獲取不到統計的數據的會報錯,這就是我為什么加上if (rdr.GetOracleValue(0).ToString() == "null")//防止為空
3,WebSERVICE的時候不知道為什么他對用戶名的大小寫也有區分。
步驟四:部署說明
在部署到真實服務器的時候,你也同樣按照步驟一中的步驟安裝客戶端ODP.NET文件,點擊執行EXE文件自動配置環境變量,查看一下是否安裝成功。
注意版本是否一致,這個是運行你的程序的關鍵,打開cmd,執行:C:\Documents and Settings\Administrator>sqlplus /nolog 就可以知道版本
我的結果:
以下找了很多與版本相關的文章---版本的問題 ODP.NET開發和部署的相關問題
http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html
http://www.cnblogs.com/codingsilence/archive/2011/07/14/2146497.html
http://blog.chinaunix.net/uid-20049824-id-1980177.html
補充 其中11.2.0.3.50 Beta的將更合適快速操作Oracle,但是需要win7和.NET Framework 4的支持,一般企業估計還沒有把win7當服務器的吧!
http://www.oracle.com/technetwork/database/windows/downloads/odpmbetainstall-1696475.html
網上的這個http://www.bitscn.com/pdb/oracle/200904/160401.html Instant client批量安裝Oracle客戶端-
安裝配置還需要從安裝過Oracle的機器上拷貝oracle.key文件還要配置環境變量。
就這么多吧,希望對你有所幫助。,下面是ODP.NET的dll
端午節快樂!