[转]在.NET中调用Oracle存储过程经验总结(3)

 

四、使用DataReader读取返回的结果集

为了让存储过程返回结果集,必须定义一个游标变量作为输出参数。这和Sql Server中有着很大的不同!并且还要用到Oracle中“包”(Package)的概念,似乎有点繁琐,但熟悉后也会觉得很方便。

关于“包”的概念,有很多内容可以参考,在此就不赘述了。首先,我创建了一个名为TestPackage的包,包头是这么定义的:

    create or replace package TestPackage is

    type mycursor is ref cursor; -- 定义游标变量

    procedure GetRecords(ret_cursor out mycursor); -- 定义过程,用游标变量作为返回参数

end TestPackage;

   

包体是这么定义的:

create or replace package body TestPackage is

/*过程体*/

         procedure GetRecords(ret_cursor out mycursor) as

         begin

             open ret_cursor for select * from test;

         end GetRecords;

end TestPackage;

 

    已经万事具备了,让我们前台调用试试:

string connectionString = "Data Source=YXZHANG;User ID=YXZHANG;Password=YXZHANG";

     string queryString = "TestPackage.GetRecords";     //注意调用方法

     OracleConnection cn = new OracleConnection(connectionString);

     OracleCommand cmd = new OracleCommand(queryString,cn);

     cmd.CommandType = CommandType.StoredProcedure;

     cmd.Parameters.Add("ret_cursor",OracleType.Cursor);     //注意这里的类型

     cmd.Parameters["ret_cursor"].Direction = ParameterDirection.Output;

    

     try

     {

         cn.Open();

         OracleDataReader dr = cmd.ExecuteReader();

         int i = 1;

         while( dr.Read() )

         {

              Console.WriteLine("Record {0}:",i++);

              Console.WriteLine("ID:{0}   Name:{1} Age:{2}",

dr.GetOracleNumber(0),

dr.GetOracleString(1),

dr.GetOracleNumber(2));

              Console.WriteLine();

         }

         dr.Close();        //用完DataReader对象要记得及时关闭

         cn.Close();        //DataReader对象未关闭之前,不能关闭连接

     }

     catch( OracleException ex )

     {

         Console.WriteLine("Exception occurred!");

         Console.WriteLine("The exception message is:{0}",ex.Message.ToString());

     }

     finally

     {

         Console.WriteLine("------------------End-------------------");

     }

 

请看结果:

Record 1:

ID:100 Name:Tony       Age:23

 

Record 2:

ID:101 Name:Jack       Age:40

 

------------------End-------------------

 

小结:

    包是Oracle特有的概念,Sql Server中找不到相匹配的东西。在我看来,包有点像VC++的类,包头就是.h文件,包体就是.cpp文件。包头只负责定义,包体则负责具体实现。如果包返回多个游标,则DataReader会按照您向参数集合中添加它们的顺序来访问这些游标,而不是按照它们在过程中出现的顺序来访问。可使用DataReader的NextResult()方法前进到下一个游标。

转载于:https://www.cnblogs.com/seven911/archive/2008/10/20/1315441.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值