zoukankan      html  css  js  c++  java
  • C#执行oracle返回游标类型的存储过程

    C#执行oracle存储过程,存储过程代码为:

    create or replace procedure proc_test(pCursor  OUT pak_pub.ut_cursor) AS  
    begin  
    open pCursor for select * from scott.emp;  
    end proc_tes;  

    其中pak_pub.ut_cursor的定义为:

    create or replace package pak_pub  
    as   
    type ut_cursor is ref cursor;   
    end;  

     两种方式:1、用微软自带的ORACLE数据访问接口(using System.Data.OracleClient)

                            注意.NET 4.0里已经没有了System.Data.OracleClient

                      2、使用ODP.NET(引用oracle客户端里的Oracle.DataAccess.dll)

    //存储过程参数设置  
    OracleParameter[] sqlParme = new OracleParameter[1];            
    //参数1  
    sqlParme[0] = new OracleParameter("pCursor", OracleType.Cursor);  
    sqlParme[0].Direction = ParameterDirection.Output;  
      
    DataTable re = DBAccess.DBExecStoredProcedure("proc_test", sqlParme);  

     DBAccess.DBExecStoredProcedure函数实现 

    public static DataTable DBExecStoredProcedure(string spName, OracleParameter[] sqlParme)  
           {  
               try  
               {  
                   //使用微软的ORACLE访问接口  
                   OraCmd.CommandText = spName;  
                 OraCmd.CommandType = CommandType.StoredProcedure;  
      
                   OraCmd.Parameters.Clear();//先清空  
                   foreach (OracleParameter parme in sqlParme)  
                   {  
                       OraCmd.Parameters.Add(parme);  
                   }  
                   DataSet ds1;  
                   DateTime EndTime;  
                   TimeSpan sp;  
                   ds1 = new DataSet();  
                   DateTime BegTime = System.DateTime.Now;  
                   OracleDataAdapter da1 = new OracleDataAdapter(OraCmd);//取出数据  
                     da1.Fill(ds1);  
                   EndTime = System.DateTime.Now;  
                   string str = "spare time:" + (EndTime - BegTime).ToString();  
                   DataTable dt = ds1.Tables[0];  
                   //调试  
                     if (dt != null && dt.Rows.Count != 0)  
                       MessageBox.Show("返回记录数" + dt.Rows.Count.ToString() + "\n" + str);  
                   TraceLog.Trace("执行时间", "返回记录数" + dt.Rows.Count.ToString() + "\n" + str);  
                   return dt;  
               }  
               catch (InvalidCastException e)  
               {  
                   TraceLog.Trace("错误", e.Message + " IOException source:"+e.Source);  
                   return null;  
               }  
           }  

    第二种方式:

    //使用ORACLE客户端访问接口  
      OracleParameter[] sqlParme = new OracleParameter[1];            
      //参数1  
      sqlParme[0] = new OracleParameter("pCursor", OracleDbType.RefCursor);  
      sqlParme[0].Direction = ParameterDirection.Output;  
      DataTable re = DBAccess.DBExecStoredProcedure("proc_test", sqlParme);  

    DBAccess.DBExecStoredProcedure函数实现同第一种方式的.

    数据库连接(ODP.NET方式)

    //DB连接   
     public static bool DBConnect(string puser,string pwd,string ds){  
                try  
                {  
                    if (OraConn!= null)//如果连接没关闭,先关闭  
                        OraConn.Close();  
                        string ConString = "Data Source=" + ds + ";User Id=" + puser + ";Password=" + pwd;  
                        OraConn = new OracleConnection(ConString);  
      
                        OraCmd = new OracleCommand("", OraConn);  
                        OraConn.Open();  
                        return true;  
      
                }  
                catch{  
                    return false;  
                }  
    }  

    是用.net自带的访问接口连接方法稍有不同:

    (连接字串应该这样写)

    string ConString = "Data Source=TEST;user=TEST001;password=123456";

     

    感觉上其实区别不大,只是如果要用到PL/SQL的数组变量的时候,第二种方式的特点就突显出来了,(而且微软已经声明.NET 4.0后不在包含oracle的访问接口,所以很多开发者都开始转向使用oracle公司提供的访问接口)

    oracle客户端的数据访问接口支持Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray,数组变量,而且支持长度限制,由于我演示的没有传入参数,这里就简单说一下,有传入参数的时候,这样

    sqlParme[0] = new OracleParameter("param1", OracleDbType.Varchar2,1000);//可限制传入参数长度  
    sqlParme[0].Direction = ParameterDirection.Input;  
    string s = "传入参数";  
    sqlParme[0].Value = s;  

    如果传入参数是PL/SQL的数组类型那就这样传

    sqlParme[0] = new OracleParameter("pDimensionFields", OracleDbType.Varchar2,1000);  
    sqlParme[0].Direction = ParameterDirection.Input;  
    sqlParme[0].CollectionType = OracleCollectionType.PLSQLAssociativeArray  
    string[] s =new string[]{ "1","2","3"};  
    sqlParme[0].Value = s;  
  • 相关阅读:
    ios app: 使用企业license设置发布app的过程
    gtest测试代码编写思想
    受尽侮辱的语言
    创业者的思维误区---《精益创业》
    session的取代者:Json Web Tokens----在客户端存储登陆状态
    lineman 的理念与 modern web app
    angularjs框架及其生态环境 --待续
    javascript的崛起及其生态元素
    Cassandra 2.x 提示“错误: 代理抛出异常错误: java.lang.NullPointerException”
    cassandra运行出现了Unable to gossip with any seeds,cqlsh链接不上,提示connection refused处理办法
  • 原文地址:https://www.cnblogs.com/OraCursor/p/5361144.html
Copyright © 2011-2022 走看看