最近使用VS2010时发现System.Data.OracleClient不再受微软支持,而是推荐使用Oracle自己的ODP.Net,于是就踏上了纠结的安装ODP.net的道路
首先我到oracle的官网注册了账号并下载了ODTwithODAC112021这个版本(http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html),这也成为我纠结的开始.因为网上介绍基本都是基于ODTwithODAC1110720这个版本(http://blog.ywxyn.com/index.php/archives/326),里面提到的一些解压的dll在ODTwithODAC112021相应路径有时找不到对应的dll,所以就很郁闷.本来不准备安装ODTwithODAC112021的(只准备解压获取dll),结果最后还是不得不安装.
安装后找到了部分dll,如Oracle.DataAccess.dll,oci.dll,ociw32.dll,orannzsbb11,oraocci11.dll 但是死活找不到介绍文章中的oraociicus11.dll 和OraOps11w.dll 两个dll,一度打算卸载ODTwithODAC112021这个版本转而安装ODTwithODAC1110720这个版本,最后将ODTwithODAC112021删除后不小心在
D:\app\Administrator\product\11.2.0\client_1\bin找到了OraOps11w.dll这个dll(隐藏的太深),然后通过这篇文章(http://camnpr.com/database/1966.html)中的oraociei11.dll (也可以用更小的oraociicus11.dll代替) 也算曲线找到了oraociicus11.dll,用oraociei11.dll(D:\app\Administrator\product\11.2.0\client_1)代替,这个dll有100多M.
结果最后把Oracle.DataAccess.dll引入,并将其它六个dll放在bin目录下还调试成功了,真是苦尽甘来,可喜可贺!
ORCL:数据库名称
system:登录名
password:密码
HOST=127.0.0.1,目前只知道用127.0.0.1
PORT=1521:端口也只知道用1521
string connstring = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)) (CONNECT_DATA=(SID=ORCL)));User Id=system;Password=sa;"; using (OracleConnection conn = new OracleConnection(connstring)) { conn.Open(); string sql = "SELECT * FROM cj_demo_crud cdc"; OracleDataAdapter oa = new OracleDataAdapter(sql, conn); DataTable dt = new DataTable(); oa.Fill(dt); }
总结:
一. 还是System.Data.OracleClient配置方便,只要引入就行,ODP.NET还要下载,安装,提取dll,很是麻烦
二.安装ODTwithODAC会导致pl/sql登录不上(ora-12154),卸载后即可(原因不明)
三、oci.dll、ociw32.dll、orannzsbb11.dll、oraocci11.dll、oraociei11.dll、OraOps11w.dll还是必须加到bin目录下,目前遇到的问题
1、绑定变量时报错,无法解析参数(上述六个dll必须放在项目的bin目录下,而不是类库,类库只用引用Oracle.DataAccess.dll即可,假设类库的名称为Demo.ODPNet,
那么项目中还除了引用Demo.ODPNet外,还必须引用Oracle.DataAccess.dll,否则会报错:类型初始值异常
四、关于command.BindByName = true;
默认情况下ODP.Net 绑定变量时,sql语句中的变量顺序必须和变量绑定顺序一致,否则Fill查不到数据,cmd.ExecuteNonQuery()返回0无法执行,
将BindByName 设为true后,sql变量顺序和绑定顺序即可不一致(以下代码不设置BindByName 则查不出数据)
DBHelper dbHelper = new DBHelper(); string sqlstr = "SELECT cc.*,ROWID FROM cde_city cc WHERE cc.provinceid=:provinceid AND cc.cityid=:cityid"; ParamsHelper parHepler = new ParamsHelper(); parHepler.Add(":cityid", "002"); parHepler.Add(":provinceid", "01"); DataTable dt = dbHelper.GetDataTable(sqlstr, parHepler.ListParameter);