Oracle学习 第30天 C#调用存储过程和语句

看了一下记录,第一次看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  />

二、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到项目(测试)中进行练习