zoukankan      html  css  js  c++  java
  • C#调用ORACLE存储过程返回结果集及函数

    oracle的存储过程返回记录集,找到两个ORACLE段都一样,只是C#部份有点区别,都放上来,个人偏向使用用第一个。

    C#调用ORACLE存储过程返回结果集及函数

    ORACLE段:
    首先在ORACLE建立PACKAGE和PACKAGE BODY,将在这里面定义函数和存储过程返回结果集。
    1:建立PACKAGE:
    CREATE OR REPLACE package SCOTT.pk_wt
    is
    type mytype is ref cursor;
    procedure p_wt(mycs out mytype);
    function f_get(str in varchar2)
    return varchar2;
    end;
    /
    说明:其实PACKAGE只是个声明罢了。我们在这里定义了一个存储过程返回结集和一个函数,返回字符串。

    2:建立PACKAGE BODY:
    CREATE OR REPLACE package BODY SCOTT.pk_wt
    is
    procedure p_wt(mycs out mytype)
    is
    begin
    open mycs for select * from test;
    end p_wt;

    function f_get(str varchar2)
    return varchar2
    is
    str_temp varchar2(100) := ''good luck!'';
    begin
    str_temp := str_temp || str;
    return str_temp;
    end f_get;

    end pk_wt;
    /
    说明:这里建立PACKAGE BODY是具体的说明和使用,将采用什么方式实现。。

    C#段:
    在C#中代码将分为两部分,一部分是使用函数,另外一部分是使用结果集。
    定义一个连接,从WEBCONFIG里去取得:
    private OracleConnection orcn=new OracleConnection(System.Configuration.ConfigurationSettings.AppSettings["scott"]);
    C#调用ORACLE函数:
    OracleCommand cmd=new OracleCommand("pk_wt.f_get",orcn);
    cmd.CommandType=CommandType.StoredProcedure;
    OracleParameter p1=new OracleParameter("str",OracleType.VarChar,10);
    p1.Direction=System.Data.ParameterDirection.Input;
    p1.Value=this.TextBox1.Text;
    OracleParameter p2=new OracleParameter("result",OracleType.VarChar,100);
    p2.Direction=System.Data.ParameterDirection.ReturnValue;
    cmd.Parameters.Add(p1);
    cmd.Parameters.Add(p2);
    orcn.Open();
    cmd.ExecuteNonQuery();
    orcn.Close();
    this.Button_function.Text=p2.Value.ToString();
    其中RESULT是系统自定义的函数返回变量,特别要注意的是,函数的参数的返回类型要指定,另外就是COMMAND类型也需要指定,另外和一般的存储过程没什么差别。

    C#调用ORACLE返回结果集:
    OracleCommand cmd=new OracleCommand("pk_wt.p_wt",orcn);
    cmd.CommandType=CommandType.StoredProcedure;
    OracleParameter p1=new OracleParameter("mycs",OracleType.Cursor);
    p1.Direction=System.Data.ParameterDirection.Output;
    cmd.Parameters.Add(p1);
    OracleDataAdapter da=new OracleDataAdapter(cmd);
    DataSet ds=new DataSet();
    da.Fill(ds,"test");
    this.DataGrid1.DataSource=ds;
    this.DataGrid1.DataBind();
    这里没什么可说的类。。只是定义的数据类型是游标,类型是OUTPUT,另外没什么了。。

    oracle的存储过程返回记录集

    oracle的存储过程返回记录集,关键之处是要用游标。
      关于数据库的游标(cursor)大家肯定都接触不少,我们可以通过OPEN,FETCH,CLOSE操作控制游标进行各种方便的操作,这方面的例子我就不在重复了。我们现在要介绍的是游标变量(cursor variable)。类似游标,游标变量也是指向一个查询结果集的当前行。不同的是,游标变量能为任何类型相似(type-compatible)的查询打开,而并不是绑定到某一个特定的查询。通过游标变量,你可以在数据库的数据提取中获得更多的方便。
      
      首先是建立表。
      
      CREATE TABLE LIHUAN.BILL_POINTS
      (
        POINTS_ID NUMBER(10,0) NOT NULL,
        CUSTOMER_ID NUMBER(10,0) NOT NULL,
        BILL_POINT_NO NUMBER(2,0) DEFAULT 1 NOT NULL,
        CONSTRAINT PK_BILL_POINTS PRIMARY KEY (POINTS_ID)
      )
      /
      
      其次,建PACKAGE
      CREATE OR REPLACE PACKAGE LIHUAN.YY_PKG_BILL_POINT_NO/*取得用户的所有计费电序号*/
      IS
      TYPE T_CURSOR IS REF CURSOR;
      
        PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
        Re_CURSOR OUT T_CURSOR);
      END;
      /
      
      再次,建PACKAGE BODY
      CREATE OR REPLACE PACKAGE BODY LIHUAN.YY_PKG_BILL_POINT_NO/*取得用户的所有计费电序号*/
      IS
      
      PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
        Re_CURSOR OUT T_CURSOR)
        IS
        V_CURSOR T_CURSOR;
        BEGIN
         OPEN V_CURSOR FOR
            select Bill_Point_No from BILL_POINTS where CUSTOMER_ID =P_CUSTOMER_ID;
            Re_CURSOR := V_CURSOR;
        END;
      END;
      /
      
      最后,在.NET中程序调用。
      public DataSet Bill_Point_No(string CUSTOMER_ID)//ok
       {
        DataSet dataset = new DataSet();
        Hashtable HT=new Hashtable();
        HT.Add(P_CUSTOMER_ID,CUSTOMER_ID);
        if(RunProcedure(Re_CURSOR,OracleType.Cursor,ref dataset,HT,bmsOracleUser+.YY_PKG_BILL_POINT_NO.BILL_POINT_NO,bmsOracleConnectionString))
        {
        ;
        }
        else
        {
        dataset=null;
        }
        return dataset;
       }
      
      public bool RunProcedure(string ReturnParameter,OracleType ParamType,ref DataSet Dataset,Hashtable HT ,string ProcedureName,string OracleConnection)
       {
        System.Data.OracleClient.OracleConnection dsconnection = new System.Data.OracleClient.OracleConnection(OracleConnection);
        System.Data.OracleClient.OracleCommand dacommand = new System.Data.OracleClient.OracleCommand(ProcedureName,dsconnection);
        dsconnection.Open();
        dacommand.CommandType=CommandType.StoredProcedure;
        IDictionaryEnumerator Enumerator;
        Enumerator = HT.GetEnumerator();
        object Value=null;
        OracleParameter OracleParam;
        OracleParam = dacommand.Parameters.Add(new OracleParameter(ReturnParameter,ParamType));
        OracleParam.Direction = ParameterDirection.Output;
        while(Enumerator.MoveNext())
        {
        Value = Enumerator.Value;
        OracleParam=dacommand.Parameters.Add(new OracleParameter(Enumerator.Key.ToString(), Value));
        }
        OracleDataAdapter ODAdapter=new OracleDataAdapter(dacommand);
            try
        {
        ODAdapter.Fill(Dataset);
         return true;
        }
        catch(System.Exception e)
        {
        e.ToString();
        return false;
        }
        finally
        {
        HT.Clear();
        dacommand.Parameters.Clear();
        dsconnection.Close();
        }

  • 相关阅读:
    Dynamic Language Runtime 微软打出的王牌
    微软发布IronRuby
    点亮Web的灯silverlight
    Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR
    奚江华的几篇Silverlight文章
    Microsoft 的 OpenSource Licence
    CPython 和IronPython的基准测试
    Mobile上的Silverlight
    Switcher Vista Areo 工具
    ASP.NET AJAX 控件开发基础
  • 原文地址:https://www.cnblogs.com/tohen/p/1584959.html
Copyright © 2011-2022 走看看