c# ODP。网调用Oracle函数返回值时报错的一个解决方案

  

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

  

于是动手一试:

  

        创建或替换函数F_Update_Grade (v_UserID数量)   返回nvarchar2   V_Grade nVARCHAR2 (20);   开始   V_Grade:=' 1205 ';   更新TESTDB3设置等级=V_Grade PKID=v_UserID;   提交;   返回(V_Grade);   结束F_Update_Grade;      

正常调用返回:

        声明   V_Result nvarchar2 (1000):=";   V_UserID数量(10):=1;   开始   V_Result:=f_update_grade (V_UserID);   dbms_output。put_line('值:' | | V_Result);   结束;/*   值:1205   */      

  

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

19.5   

 c# ODP。网调用Oracle函数返回值时报错的一个解决方案

  

2,核心访问代码:

        使用Oracle.ManagedDataAccess.Client;   使用系统;   使用System.Data;   使用System.Data.SqlClient;      名称空间TestOracle_ManagedDataAccess   {   类项目   {   静态void Main (string [] args)   {   TestFUNCTION3 ();   Console.ReadLine ();   }      静态孔隙TestFUNCTION3 ()   {   字符串strConn=" Data Source=127.0.0.1/BCS;用户ID=user2019;密码=password9102”;//OracleConnection objConn=new OracleConnection (strConn);   字符串strFun=癋_Update_Grade”;//字符串strFun=癋_Get_Grade”;   使用(OracleConnection objConn=new OracleConnection (strConn))   {   使用(OracleCommand cmd=new OracleCommand (strFun objConn))   {   试一试   {//获取选中行//int strRowIdex=1;//创建参数对象   OracleParameter p1=new OracleParameter (“v_UserID OracleDbType。Int32, ParameterDirection.Input);   OracleParameter p2=new OracleParameter (“V_Grade OracleDbType。NVarchar2 20);   p1。值=https://www.yisu.com/zixun/1;//取PKID为1的记录   p2。方向=ParameterDirection.ReturnValue;//更新数据库表   cmd。CommandType=CommandType.StoredProcedure;   objConn.Open ();/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *   *注意,输出参数一定要第一个加,函数的返回值也是赋给第一个参数*;   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */cmd.Parameters.Add (p1);   cmd.Parameters.Add (p2);   cmd.ExecuteNonQuery ();//返回结果值   控制台。WriteLine (“V_Grade是:”+ p2.Value.ToString ());   Console.WriteLine(“OK”);   }   抓住(SqlException异常交货)   {   objConn.Close ();   控制台。WriteLine(“错误:“+ ex.Message);   }   最后   {   cmd.Dispose ();   objConn.Close ();   }   }   }   }      

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

        更新testdb3组级=1,PKID=1;      

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

  

 c# ODP。网调用Oracle函数返回值时报错的一个解决方案

  

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

  

 c# ODP。网调用Oracle函数返回值时报错的一个解决方案

  

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

  

 c# ODP。网调用Oracle函数返回值时报错的一个解决方案

  

  

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

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

c# ODP。网调用Oracle函数返回值时报错的一个解决方案