c# 定义oracle函数返回值,C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案

有人在社区问到:C#调用Oracle中自定义函数的返回值时,无法正常调用。但在PL/SQL中正常调用返回。

于是动手一试:

1、准备函数(Oralce 11g.2.0.0.4)

CREATE OR REPLACE FUNCTION F_Update_Grade(v_UserID in Number)

return nvarchar2 is

V_Grade nVARCHAR2(20);

begin

V_Grade := '';

update TESTDB3 set Grade = V_Grade where PKID = v_UserID;

commit;

return (V_Grade);

end F_Update_Grade;

正常调用返回:

declare

V_Result nvarchar2(1000) := '';

V_UserID number(10) := 1;

begin

V_Result := f_update_grade(V_UserID);

dbms_output.put_line('Value:' || V_Result);

end;

/*

Value:1205

*/

2、C#环境准备:(VS2019 社区版)

1)准备Oracle.ManagedDataAccess.Client,在Nuget管理器中搜索Oralce,并安装Oracle.ManagedDataAccess最新稳定版19.5

939d43c20216d477609d9fb1e5d6cec9.png

2、核心访问代码:

using Oracle.ManagedDataAccess.Client;

using System;

using System.Data;

using System.Data.SqlClient;

namespace TestOracle_ManagedDataAccess

{

class Program

{

static void Main(string[] args)

{

TestFUNCTION3();

Console.ReadLine();

}

static void TestFUNCTION3()

{

string strConn = "Data Source=127.0.0.1/BCS;User ID=user2019;Password=password9102";

//OracleConnection objConn = new OracleConnection(strConn);

string strFun = "F_Update_Grade";

//string strFun = "F_Get_Grade";

using (OracleConnection objConn = new OracleConnection(strConn))

{

using (OracleCommand cmd = new OracleCommand(strFun, objConn))

{

try

{

// 获取选中行

//int strRowIdex = 1;

// 创建参数对象

OracleParameter p1 = new OracleParameter("v_UserID", OracleDbType.Int32, ParameterDirection.Input);

OracleParameter p2 = new OracleParameter("V_Grade", OracleDbType.NVarchar2, );

p1.Value = ;//取PKID为1的记录

p2.Direction = ParameterDirection.ReturnValue;

// 更新数据库表

cmd.CommandType = CommandType.StoredProcedure;

objConn.Open();

/***************************************************************

* 注意,输出参数一定要第一个加,函数的返回值也是赋给第一个参数*;

* *************************************************************/

cmd.Parameters.Add(p1);

cmd.Parameters.Add(p2);

cmd.ExecuteNonQuery();

//返回结果值

Console.WriteLine("V_Grade is :" + p2.Value.ToString());

Console.WriteLine("OK");

}

catch (SqlException ex)

{

objConn.Close();

Console.WriteLine("ERROR in :" + ex.Message);

}

finally

{

cmd.Dispose();

objConn.Close();

}

}

}

}

运行调试,没报错,但也没有更新数据表,注意:在执行前先将原数据表中Grade值更新为1,程序运行后Grade值仍为1。

update testdb3 set grade=1 where PKID=1;

跟踪调试,发现参数值不对,  p2.Direction = ParameterDirection.ReturnValue;,结果返回值给p1。

4ed396ae105b4004b97922f0afb88135.png

莫非,默认给的是第一个参数,调换p1,p2的顺序,果然正常调用:

16e23a585a5d2c15900bb97c1bed7e8a.png

运行结果,数据表中的行也更新完成:

2254e67ed81f774b68d8df3e4dda8b28.png

小结:

Oracle.ManagedDataAccess.Client调用有返回值的函数时, cmd.Parameters.Add的第一个参数一定要是ParameterDirection.ReturnValue。不确定这是不是一个bug?

C++ 调用webservice 出现 函数返回值为 3 (SOAP_TAG_MISMATCH) 的解决方案

最近在用C++ gsoap做webservice服务时,函数返回值为SOAP_TAG_MISMATCH (==3)错误码,原因是我传入wsdl地址时连同后面的?wsdl都传入了,如下: http:// ...

lua调用c++函数返回值作用

2015/05/28 lua调用c++接口,返回给lua函数的是压入栈的内容,可以有多个返回值.但是c++接口本身也是有返回值的,这个返回值也非常的重要,会决定最后返回到lua函数的值的个数. (1) ...

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include #include #include < ...

Shell函数:Shell函数返回值、删除函数、在终端调用函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...

Shell函数返回值、删除函数、在终端调用函数

Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] ...

【Shell脚本学习22】Shell 函数:Shell函数返回值、删除函数、在终端调用函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...

shell调用函数返回值深入分析

编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢? 首先shell中调用函数有两种方式: 第一种:value=`functi ...

Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

随机推荐

前端学HTTP之数据传输

× 目录 [1]客户机处理 [2]集线器处理 [3]路由器1处理[4]路由器2处理[5]交换机处理[6]服务器处理[7]反向传输 前面的话 上一篇中,介绍了网络基础.本文将详细介绍客户机在浏览网页ab ...

FMDBsqilte语句样式

举例: @"create table student(stuid integer primary key autoincrement,name text,number integer,the ...

R语言Cairo包的使用

Cairo使用起来非常简单,和基础包grDevices中的函数对应. CairoPNG---grDevices:png(). CairoTIFF---grDevices:tiff(). CairoPD ...

Java虚拟机支持的最大内存限制

最近在开发Java的程序.本来我是一直很喜欢Java的内存管理的,不需要担心分配内存,只管分配,垃圾收集器自己会给你回收内存的.现在开发的程序数据量很大,为了速度快,我准备把所有的信息加载进内存,这样 ...

用VBS脚本发邮件

需求是这样的:针对账号的管理,如果发现该账号的管理员给账号加了批注,(比如要过期,修改密码,完善资料等),就需要找到这样的账号及其管理的邮件,然后发邮件给他们的管理员同时抄送给账号以达到提醒的目的.那 ...

一张地图告诉你,只JavaScript不够!

这将是JavaScript语法,你真的会一JavaScript嘛.看看这个图片!超好用JavaScript一本书的摘录游.熊儿.快去学习! 版权声明:本文博客原创文章.博客,未经同意,不得转载.

关于JDK1.7+中HashMap对红黑树场景的思考

背景 在1.7之前的版本,当数组元素较多(几百.几千,或者更多)的时候,在这种前提扩容,涉及全量元素的遍历和坐标的重新定位,这个耗时会比较长.这是之前存在的一个弊端吧.那么引入红黑树之后就解决了问题, ...

iptables系列

详情请参考:http://www.zsythink.net/archives/tag/iptables/page/2/

Python异常处理机制、调试、测试

类似于Java的try..catch..finally Java的为try_except_finally try: print('try...') r = / print('result:', r) ...

用AOP拦截自定义注解并获取注解属性与上下文参数(基于Springboot框架)

目录 自定义注解 定义切面 获取上下文信息JoinPoint ProceedingJoinPoint 定义测试方法 测试结果 小结 AOP可以用于日志的设计,这样话就少不了要获取上下文的信息,博主在设 ...


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部