看了一下记录,第一次看Oracle的教程是16年6月10号,一年零一个多月了,才累计了30天的学习。。。
经过几天的折腾,终于能在C#里像调用SQL Server一样自如地调用Oracle的存储过程和语句了,虽然有些曲折,但好歹能实现
一、C#调用Oracle
要引用Oracle.ManagedDataAccess.dll,一个就够了,连接串如下,要注意是【providerName="Oracle.ManagedDataAccess.Client"】,网上有时说是【providerName="Oracle.ManagedDataAccess"】,折腾了半天
<add name="XX" providerName="Oracle.ManagedDataAccess.Client" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.XX)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User ID=XX;Password=XX;" />
二、DataReader
原先代码里处理SQL Server都有一整套的DataReader处理方法,也提供了Oracle的,把SqlXXX的全改为OracleXXX的就可以了
三、直接执行Oracle语句
和SQL类似,但要注意"SELECT * FROM XX"的Oracle语句里末尾不能带分号。
封装好的ExecuteNoQuery、ExecuteScalar、ExecuteReader 用法都完全一样
四、参数化调用存储过程
如果需要存储过程输出,则要在参数类里定义一个可取出的游标
sCUR = new OracleParameter("@sCUR", OracleDbType.RefCursor, ParameterDirection.Output);
Oracle存储过程不支持直接输出SELECT * XX 这样的结果集了,只能用游标OPEN CURSOR FOR SELECT * FROM XX,这是特别烦的一点
五、调用函数
基本类似,函数倒可以直接返回内容,一般也都是字符串
六、直接用语句(字符串)调用存储过程
这个稍微折腾了一下,想要像SQL那样直接"EXEC XXX('xx')"这么爽是不行的,原本都快放弃了,但最终想到一个变通的方法
1、定义一个中转存储过程,用于接收字符串语句,第一个参数用于内部一些区分(这里暂没用到),第二个参数是要执行的字符串,第三个参数是要带出数据的游标
CREATE OR REPLACE PROCEDURE upCurrentQuery ( sAction VARCHAR2, sSQLText VARCHAR2, sCUR OUT SYS_REFCURSOR ) AS sSQL CLOB; BEGIN EXECUTE IMMEDIATE sSQLText USING sCUR; END upCurrentQuery;
2、由于存储过程调用要有BEGIN END,干脆封装在参数类里,省得每次都要传
UpCurrentQueryParam param = new UpCurrentQueryParam { sAction = { Value = model.sAction }, sSQLText = { Value = string.Format(@" BEGIN {0} END;", model.sSQLText) } };
3、调用存储过程时不要加EXEC或CALL,直接写存储过程名,要注意最后要带上:XX的游标(与存储过程里的名字要一致),这样通过中转存储过程的USING XX就可以带出结果集了
UpCurrentQueryModel ucqModel = new UpCurrentQueryModel { sAction = "", sSQLText = @"XXX('XX', '', :sCUR);" };
七、Linq
之前有一篇随笔研究过了,一定表、字段定义注意下即可,Linq查询本身不用动
八、分页
暂时没去研究了,既然存储过程能调用,应该也是传些参数进行分页即可。但刚上手时也会有坑就是了
Oracle的研究暂告一段落吧,刚好满30天,下一阶段打算引进一个新的UI到项目(测试)中进行练习