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

  • 相关阅读:
    `/usr/java/jdk1.8.0_101': not a valid identifier
    gem sources -a https://ruby.taobao.org/ 提示:Error fetching https://ruby.taobao.org/ SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: ce rtificate verify failed
    ERROR: While executing gem ... (Encoding::UndefinedConversionError) U+7CFB to IBM437 in conversion from UTF-16LE to UTF-8 to IBM437,当你执行gem 命令时,提示如上信息解决方案如下。
    ubuntu15.10安装 jdk
    ubuntu 如何安装tomcat
    Mac pro 上安装 robotframework 时的一个版本问题
    AppBuilder(四)SignatureConversions
    AppBuilder(三)BuildInternal
    AppBuilder(二)UseStageMarker
    AppBuilder(一)Use汇总
  • 原文地址:https://www.cnblogs.com/liuyouying/p/7242822.html
Copyright © 2011-2022 走看看