C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案
有人在社区问到:C#调用Oracle中自定义函数的返回值时,无法正常调用。但在PL/SQL中正常调用返回。
于是动手一试:
1、准备函数(Oralce11g.2.0.0.4)
CREATEORREPLACEFUNCTIONF_Update_Grade(v_UserIDinNumber) returnnvarchar2is V_GradenVARCHAR2(20); begin V_Grade:='1205'; updateTESTDB3setGrade=V_GradewherePKID=v_UserID; commit; return(V_Grade); endF_Update_Grade;
正常调用返回:
declare V_Resultnvarchar2(1000):=''; V_UserIDnumber(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、核心访问代码:
usingOracle.ManagedDataAccess.Client; usingSystem; usingSystem.Data; usingSystem.Data.SqlClient; namespaceTestOracle_ManagedDataAccess { classProgram { staticvoidMain(string[]args) { TestFUNCTION3(); Console.ReadLine(); } staticvoidTestFUNCTION3() { stringstrConn="DataSource=127.0.0.1/BCS;UserID=user2019;Password=password9102"; //OracleConnectionobjConn=newOracleConnection(strConn); stringstrFun="F_Update_Grade"; //stringstrFun="F_Get_Grade"; using(OracleConnectionobjConn=newOracleConnection(strConn)) { using(OracleCommandcmd=newOracleCommand(strFun,objConn)) { try { //获取选中行 //intstrRowIdex=1; //创建参数对象 OracleParameterp1=newOracleParameter("v_UserID",OracleDbType.Int32,ParameterDirection.Input); OracleParameterp2=newOracleParameter("V_Grade",OracleDbType.NVarchar2,20); p1.Value=1;//取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_Gradeis:"+p2.Value.ToString()); Console.WriteLine("OK"); } catch(SqlExceptionex) { objConn.Close(); Console.WriteLine("ERRORin:"+ex.Message); } finally { cmd.Dispose(); objConn.Close(); } } } }
运行调试,没报错,但也没有更新数据表,注意:在执行前先将原数据表中Grade值更新为1,程序运行后Grade值仍为1。
updatetestdb3setgrade=1wherePKID=1;
跟踪调试,发现参数值不对,p2.Direction=ParameterDirection.ReturnValue;,结果返回值给p1。
莫非,默认给的是第一个参数,调换p1,p2的顺序,果然正常调用:
运行结果,数据表中的行也更新完成:
小结:
Oracle.ManagedDataAccess.Client调用有返回值的函数时,cmd.Parameters.Add的第一个参数一定要是ParameterDirection.ReturnValue。不确定这是不是一个bug?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。