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

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。

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

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

小结:
Oracle.ManagedDataAccess.Client调用有返回值的函数时, cmd.Parameters.Add的第一个参数一定要是ParameterDirection.ReturnValue。不确定这是不是一个bug?
C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案的更多相关文章
- 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 <stdio.h> #include <unistd.h> #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)语法详解 ...
随机推荐
- Activiti工作流框架学习(一)之通用数据表详细介绍
文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期.更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其 ...
- Vue-Property-Decorator源码分析
概述 vue-property-decorator是基于vue组织里vue-class-component所做的拓展,先来了解一下vue-class-component Vue-Class-Compo ...
- Linux发展历史(简略)
LINUX UNIX历史发展 1969肯 汤姆森在DEC PDP-7机器上开发出了UNIX系统 1971肯 汤姆森的同事丹尼斯 里奇发明了C语言 1973UNIX系统绝大部分用C语言重写,为提高UNI ...
- PAT(甲级)2018年冬季考试
1152 Google Recruitment 思路:判断素数 #include<bits/stdc++.h> using namespace std; const int maxn = ...
- MySQL+Keepalived高可用配置
注意:首先关闭两台机器的防火墙 setenforce 0 Environment: 2台CentOS测试机器 安装好MySQL 1.两台机器安装keepalived yum -y install k ...
- http状态码_____ 204/206/200
HTTP的状态码有很多种,主要有五个大类 1xx(临时响应) 2xx(成功) 3xx(已重定向) 4xx(请求错误) 5xx(服务器错误) 每个大类还对应一些具体的分类.平时我们接触比较多的是200. ...
- 2019CCPC秦皇岛D题 Decimal
Decimal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- HDU5919 Sequence II(主席树)
Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...
- table内容保存到Excel中
@{ Layout = null; } <html> <head> <title></title> </head> <body> ...
- kafka生产消息,streaming消费
package com.bd.useranalysis.spark.streaming.kafka2es; import com.alibaba.fastjson.JSON; import com.b ...