zoukankan      html  css  js  c++  java
  • C#调用oracle存储过程 最简单的实例

     
    Oracle方面
      1.创建Oracle过程存储
      create or replace procedure proce_test(paramin in varchar2,paramout out varchar2,paraminout in out varchar2)
      as
       varparam varchar2(28);
      begin
       varparam:=paramin;
       paramout:=varparam|| paraminout;
      end;
      2.测试过程存储
      declare
       param_out varchar2(28);
       param_inout varchar2(28);
      begin
       param_inout:='ff';
       proce_test('dd',param_out,param_inout);
       dbms_output.put_line(param_out);
      end;
      C#方面
      引用Oracle组件
      using System;
      using System.Data;
      using System.Data.OracleClient;
      namespace WebApplication4
      {
       public class OraOprater
       {
       private OracleConnection conn=null;
       private OracleCommand cmd=null;
       public OraOprater()
       {
       string mConn="data source=ora9i.ora.com;user id=ora;password=ora"; //连接数据库
       conn=new OracleConnection(mConn);
       try
       {
       conn.Open();
       cmd=new OracleCommand();
       cmd.Connection=conn;
       }
       catch(Exception e)
       {
       throw e;
       }
       }
       public string SpExeFor(string m_A,string m_B)
       {
       //存储过程的参数声明
       OracleParameter[] parameters={
       new OracleParameter("paramin",OracleType.VarChar,20),
       new OracleParameter("paramout",OracleType.VarChar,20),
       new OracleParameter("paraminout",OracleType.VarChar,20)
       };
       parameters[0].Value=m_A;
       parameters[2].Value=m_B;
       parameters[0].Direction=ParameterDirection.Input;
       parameters[1].Direction=ParameterDirection.Output;
       parameters[2].Direction=ParameterDirection.InputOutput;
       try
       {
       RunProcedure("proce_test",parameters);
       return parameters[1].Value.ToString();
       }
       catch(Exception e)
       {
       throw e;
       }
       }
       private void RunProcedure(string storedProcName,OracleParameter[] parameters)
       {
       cmd.CommandText=storedProcName;//声明存储过程名
       cmd.CommandType=CommandType.StoredProcedure;
       foreach(OracleParameter parameter in parameters)
       {
       cmd.Parameters.Add(parameter);
       }
       cmd.ExecuteNonQuery();//执行存储过程
       }
       }
      }
      测试结果:ddff
     

     

    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();
        }

  • 相关阅读:
    算法
    如果业界中不用高级算法和数据结构,那为什么还要学?
    CentOS 7 运行级别切换
    ECharts笔记
    Vue+TypeScript学习
    TypeScript深入学习
    TypeScript基础
    检测数据类型的方法
    前端提高性能的方式
    柯里化
  • 原文地址:https://www.cnblogs.com/keim/p/2883698.html
Copyright © 2011-2022 走看看