C# 使用OCCI 连接Oracle 数据库


最近因需要研究了一下C#向Oracle数据库中插入数据的问题,通常情况下使用微软自带的组件ADO.NET来连接并操作数据库,这也是最简便的方式,用法也比较简单,即在程序开头加上using System.Data.OracleClient。另外就是使用Oracle提供的ODP.net,这需要下载ODAC,并在程序中引用Oracle.DataAccess.dll。

接下来写程序测试向数据库中插入记录的速度了,首先尝试使用ADO.net。

部分代码如下:

  1. OracleConnection conn=new OracleConnection(“Data Source=db;User id=user;Password=pass”);  
  2. conn.Open();  
  3. OracleCommand cmd=new OracleCommand();  
  4. cmd.Connection=conn;  
  5. OracleTransaction trans=conn.BeginTransaction();  
  6. cmd.Transaction=trans;  
  7. Stopwatch stp=new Stopwatch();  
  8. cmd.CommandText=”insert into dbk_test values(to_date(’2012-06-05 10:00:00′,’yyyy-mm-dd hh24:mi:ss’),’1234567890′,’987654321′,’This is a test message’)”;  
  9. for(int i=0;i<20000;++i)  
  10. {  
  11. cmd.ExecuteNonQuery();  
  12. if(i%1000==0)  
  13. trans.Commit();  
  14. }  
  15. trans.Commit();  
  16. conn.Close();  
  17. stp.Stop();  
  18. Console.writeLine(“Time Elapsed:”+stp.ElapsedMilliseconds+”ms”);  

C#程序运行在Windows Server 2008 32位上,机器为Xeon E552O * 2,2.27Ghz,共16核内存12GB。Oracle 安装在RedHat AS4U4,cpu为AMD Opterron 275 * 2 ,2.2GHz,共4核心,内存16GB,oracle 10g。
测试结果为33秒左右,每秒插入不到700条,之后也采用了绑定变量及调用存储过程等方法,插入速度也没有多大提高。

于是想到了用ODP.net,在网上查到说ODAC的版本必须与安装的oracle对应,虽然这个要求感觉不太灵活,因为实际的使用环境可能与开发环境不一致,到时还要更换ODAC的版本,且ODAC在官网上并不是能对应上所有的Oracle版本。在网上看到使用ODP.net插入速度可以达到数万条每秒,但我多次尝试时,都在运行时出现问题,根本无法运行成功。于是便放弃了。Oracle与MS的东西兼容性不强,或者说是Oracle本身向下兼容的能力弱,真是令人抓狂。

多方查找后发现了OCI这个东西,于是想到了使用封装了OCI的OCCI,这样眼前突然一亮。之后的思路就很清淅了,先用c++做一个dll,里面的函数是对OCCI的进行一步封装,再用c#调用这个dll就可以了。下面就是实现的具体过程了。

  • 1
  • 2
  • 下一页

相关内容