文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2019-11-23 11:36

关注

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

于是动手一试:

准备函数(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 := "1205";
  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;

 

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

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

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

 

核心访问代码:

 1 using Oracle.ManagedDataAccess.Client;
 2 using System;
 3 using System.Data;
 4 using System.Data.SqlClient;
 5 
 6 namespace TestOracle_ManagedDataAccess
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             TestFUNCTION3();
13             Console.ReadLine();
14         }
15 
16         static void TestFUNCTION3()
17         {
18             string strConn = "Data Source=127.0.0.1/BCS;User ID=user2019;Password=password9102";
19             //OracleConnection objConn = new OracleConnection(strConn);
20             string strFun = "F_Update_Grade";
21             //string strFun = "F_Get_Grade";
22             using (OracleConnection objConn = new OracleConnection(strConn))
23             {
24                 using (OracleCommand cmd = new OracleCommand(strFun, objConn))
25                 {
26                     try
27                     {
28                         // 获取选中行
29                         //int strRowIdex = 1;
30 
31                         // 创建参数对象
32                         OracleParameter p1 = new OracleParameter("v_UserID", OracleDbType.Int32, ParameterDirection.Input);
33                         OracleParameter p2 = new OracleParameter("V_Grade", OracleDbType.NVarchar2, 20);
34                         p1.Value = 1;//取PKID为1的记录
35                         p2.Direction = ParameterDirection.ReturnValue;
36                         // 更新数据库表
37                         cmd.CommandType = CommandType.StoredProcedure;
38                         objConn.Open();
39 
40                         
43                         cmd.Parameters.Add(p1);
44                         cmd.Parameters.Add(p2);
45                         cmd.ExecuteNonQuery();
46 
47                         //返回结果值
48                         Console.WriteLine("V_Grade is :" + p2.Value.ToString());
49                         Console.WriteLine("OK");
50                     }
51                     catch (SqlException ex)
52                     {
53                         objConn.Close();
54                         Console.WriteLine("ERROR in :" + ex.Message);
55                     }
56                     finally
57                     {
58                         cmd.Dispose();
59                         objConn.Close();
60                     }
61                 }
62             }
63         }

 

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

update testdb3 set grade=1 where PKID=1;

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

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

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

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

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

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

 

小结:

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

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯