`
sjk2013
  • 浏览: 2185990 次
文章分类
社区版块
存档分类
最新评论

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;


分享到:
评论

相关推荐

    C#调用oracle方法(包括调用存储过程)

    详细的记录了C#如何调用oracle以及带有存储过程输出变量的方法,适合初学者。

    库存管理系统(c# + oracle)

    这是一个基于C#.NET的Winform程序,使用oracle数据库。...程序中数据库方面使用了oracle中存储过程、游标、程序包、触发器等。对oracle数据库的基本学习、以及c#/winform程序的学习有非常好的帮助。

    oracle数据库中查看系统存储过程的方法

    您可能感兴趣的文章:Oracle存储过程游标用法分析oracle存储过程常用的技巧(详)asp.net中调用oracle存储过程的方法C#调用Oracle存储过程的方法oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)Oracle存储...

    21天学通Oracle

    第一篇 Oracle管理配置 第1章 Oracle安装配置(教学视频:10分钟) 23 1.1 Oracle简介 23 1.1.1 数据库术语 23 1.1.2 主流数据库简介 24 ...第23章 Oracle在C#开发中的应用(教学视频:12分钟) 391

    Oracle入门很简单[张朝明].part2

    第3篇以数据库对象为主线讲述了包括视图、约束、游标、触发器、序列、用户角色与权限控制、函数与存储过程等内容;第4篇则重点讲述了oracle性能优化、一致性与事务管理、并发控制等内容;第5篇讲述了oracle在主流...

    Oracle入门很简单[张朝明].part1

    第3篇以数据库对象为主线讲述了包括视图、约束、游标、触发器、序列、用户角色与权限控制、函数与存储过程等内容;第4篇则重点讲述了oracle性能优化、一致性与事务管理、并发控制等内容;第5篇讲述了oracle在主流...

    精通sql结构化查询语句

    以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...

    亮剑.NET深入体验与实战精要2

    5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 ...

    亮剑.NET深入体验与实战精要3

    5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 ...

Global site tag (gtag.js) - Google Analytics