c#调oracle存储过程返回结果集

c#调oracle存储过程返回结果集 

2012-07-28 21:57:49|  分类: 专业 |  标签:oracle  odp.net  oracleclient  c#  refcursor  |字号订阅

 
 

这是无比重要的一个问题。

一般有两种方法可以访问到oracle,一种是调dotnet自带的oracleclient。一种是调用oracle官方提供的ODP.net。

两者提供的接口基本一样。关于如何在存储过程中返回结果集。上一篇文章中已找到了办法。现在稍微总结一下:

一、给要返回记录集的存储过程定义sys_refcursor类型的out参数,例如:

  create or replace procedure test01(v out sys_refcursor)……

二、在存储过程体中写open v for select ................

写法就这么简单。存储过程可以写在包里面,也可以不写在包里面,有人讲:存储过程如果要返回记录集,一定要自己定义包,然后在包里面定义存储过程。本人已经作了实验,在包里、包外都可以。

在C#中怎么做呢?

一、引用

  如果是oracleclient,引用System.Data.OracleClient

  题外话:不知道要不要装oracleclient,配置tns。总之我是配了的。没有调过没配会怎么样。

  如果是ODP.net,引用Oracle.DataAccess,还需将如下文件复制到exe的运行目录下,如果是debug模式下调试,bin/debug下。

  c调oracle存储过程返回结果集 - 伯平 - 涤心斋

  项目引用截图如下:

  c调oracle存储过程返回结果集 - 伯平 - 涤心斋

二、解决了引用,那就是代码中怎么写了,截图如下:

c调oracle存储过程返回结果集 - 伯平 - 涤心斋
如上图所示,图中标圈的都是要注意的。
1.如果存储过程定义在包中,请在前面带上包名,如果不在包中,直接在commandText中放存储过程名即可
2.odp.net中,返回记录集的参数应为RefCursor。oracleclient版写法则是Cursor
3.千万要注意,参数类型一定要是Output,而不是网上一些资料中所说的ReturnValue。一用ReturnValue就报错。

三、上面是调存储过程,那么调oracle中的函数又是如何调的呢,有什么不同?

1.函数及上面的存储过程代码如下:

c调oracle存储过程返回结果集 - 伯平 - 涤心斋
2.c#中调用代码如下:
c调oracle存储过程返回结果集 - 伯平 - 涤心斋
对比前面,有什么不同?
在c#代码中,唯一的不同就是参数的Direction不同,是ReturnValue。可见网上的诸位大侠所说的用ReturnValue的情况应是指调函数,而非存储过程。
posted @ 2013-09-04 11:16  刘先虎  阅读(530)  评论(0编辑  收藏  举报