c#调oracle存储过程返回结果集
这是无比重要的一个问题。
一般有两种方法可以访问到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存储过程返回结果集 - 伯平 - 涤心斋](http://img6.ph.126.net/qYt-HadW6vePoJIOX2DhTA==/2484861094419416136.jpg)
如上图所示,图中标圈的都是要注意的。
1.如果存储过程定义在包中,请在前面带上包名,如果不在包中,直接在commandText中放存储过程名即可
2.odp.net中,返回记录集的参数应为RefCursor。oracleclient版写法则是Cursor
3.千万要注意,参数类型一定要是Output,而不是网上一些资料中所说的ReturnValue。一用ReturnValue就报错。
三、上面是调存储过程,那么调oracle中的函数又是如何调的呢,有什么不同?
1.函数及上面的存储过程代码如下:
![c调oracle存储过程返回结果集 - 伯平 - 涤心斋](http://img2.ph.126.net/yYHPkforTnYH_KgKUpwgEQ==/6597364435772737722.jpg)
2.c#中调用代码如下:
![c调oracle存储过程返回结果集 - 伯平 - 涤心斋](http://img7.ph.126.net/nG4wB9LWtTb0iCoZUcUghA==/2487394369209809327.jpg)
对比前面,有什么不同?
在c#代码中,唯一的不同就是参数的Direction不同,是ReturnValue。可见网上的诸位大侠所说的用ReturnValue的情况应是指调函数,而非存储过程。