C# ODP.NET 調(diào)用Oracle函數(shù)返回值時報錯的一個解決方案
有人在社區(qū)問到:C#調(diào)用Oracle中自定義函數(shù)的返回值時,無法正常調(diào)用。但在PL/SQL中正常調(diào)用返回。
于是動手一試:
1、準(zhǔn)備函數(shù)(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;
正常調(diào)用返回:
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#環(huán)境準(zhǔn)備:(VS2019 社區(qū)版)
1)準(zhǔn)備Oracle.ManagedDataAccess.Client,在Nuget管理器中搜索Oralce,并安裝Oracle.ManagedDataAccess最新穩(wěn)定版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;
// 創(chuàng)建參數(shù)對象
OracleParameter p1 = new OracleParameter("v_UserID", OracleDbType.Int32, ParameterDirection.Input);
OracleParameter p2 = new OracleParameter("V_Grade", OracleDbType.NVarchar2, 20);
p1.Value = 1;//取PKID為1的記錄
p2.Direction = ParameterDirection.ReturnValue;
// 更新數(shù)據(jù)庫表
cmd.CommandType = CommandType.StoredProcedure;
objConn.Open();
/***************************************************************
* 注意,輸出參數(shù)一定要第一個加,函數(shù)的返回值也是賦給第一個參數(shù)*;
* *************************************************************/
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.ExecuteNonQuery();
//返回結(jié)果值
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();
}
}
}
}
運行調(diào)試,沒報錯,但也沒有更新數(shù)據(jù)表,注意:在執(zhí)行前先將原數(shù)據(jù)表中Grade值更新為1,程序運行后Grade值仍為1。
update testdb3 set grade=1 where PKID=1;
跟蹤調(diào)試,發(fā)現(xiàn)參數(shù)值不對, p2.Direction = ParameterDirection.ReturnValue;,結(jié)果返回值給p1。

莫非,默認(rèn)給的是第一個參數(shù),調(diào)換p1,p2的順序,果然正常調(diào)用:

運行結(jié)果,數(shù)據(jù)表中的行也更新完成:

小結(jié):
Oracle.ManagedDataAccess.Client調(diào)用有返回值的函數(shù)時,cmd.Parameters.Add的第一個參數(shù)一定要是ParameterDirection.ReturnValue。不確定這是不是一個bug?
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
WPF實現(xiàn)動畫效果(二)之From/To/By動畫
這篇文章介紹了WPF實現(xiàn)動畫效果之From/To/By動畫,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
分享我在工作中遇到的多線程下導(dǎo)致RCW無法釋放的問題
最近在做項目中遇到一個問題,在調(diào)用一個類庫中的方法時,出現(xiàn)如下異常信息:嘗試釋放正在使用的RCW,活動線程或其他線程上正在使用該 RCW,釋放正在使用的 RCW 的嘗試會導(dǎo)致?lián)p壞或數(shù)據(jù)丟失2015-12-12

