zoukankan      html  css  js  c++  java
  • 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 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到项目(测试)中进行练习

  • 相关阅读:
    【LOJ】 #2015. 「SCOI2016」妖怪
    【LOJ】#2016. 「SCOI2016」美味
    【LOJ】 #2008. 「SCOI2015」小凸想跑步
    【LOJ】#2007. 「SCOI2015」国旗计划
    【LOJ】#2006. 「SCOI2015」小凸玩矩阵
    【LOJ】#2172. 「FJOI2016」所有公共子序列问题
    【LOJ】#2173. 「FJOI2016」建筑师
    【LOJ】#2174. 「FJOI2016」神秘数
    【LOJ】#2280. 「FJOI2017」矩阵填数
    【洛谷】P4585 [FJOI2015]火星商店问题
  • 原文地址:https://www.cnblogs.com/liuyouying/p/7242822.html
Copyright © 2011-2022 走看看