iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >C# ODP.NET 调用Oracle函数返回值时报错的一个解决方案
  • 291
分享到

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

摘要

有人在社区问到:C#调用oracle中自定义函数的返回值时,无法正常调用。但在PL/sql中正常调用返回。 于是动手一试: 准备函数(Oralce 11g.2.0.0.4) CREATE OR REPLACE FUNCTioN F_Upd

有人在社区问到: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?

 

您可能感兴趣的文档:

--结束END--

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

本文链接: https://www.lsjlt.com/news/2969.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作