有人在社區問到:C#調用Oracle中自定義函數的返回值時,無法正常調用。但在PL/SQL中正常調用返回。
於是動手一試:
1、準備函數(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;
/*
Value:1205
*/
2、C#環境準備:(VS2019 社區版)
1)準備Oracle.ManagedDataAccess.Client,在Nuget管理器中搜索Oralce,並安裝Oracle.ManagedDataAccess最新穩定版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;
// 創建參數對象
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;
// 更新數據庫表
cmd.CommandType = CommandType.StoredProcedure;
objConn.Open();
/***************************************************************
* 注意,輸出參數一定要第一個加,函數的返回值也是賦給第一個參數*;
* *************************************************************/
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
cmd.ExecuteNonQuery();
//返回結果值
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();
}
}
}
}
運行調試,沒報錯,但也沒有更新數據表,注意:在執行前先將原數據表中Grade值更新爲1,程序運行後Grade值仍爲1。
update testdb3 set grade=1 where PKID=1;
跟蹤調試,發現參數值不對, p2.Direction = ParameterDirection.ReturnValue;,結果返回值給p1。
莫非,默認給的是第一個參數,調換p1,p2的順序,果然正常調用:
運行結果,數據表中的行也更新完成:
小結:
Oracle.ManagedDataAccess.Client調用有返回值的函數時, cmd.Parameters.Add的第一個參數一定要是ParameterDirection.ReturnValue。不確定這是不是一個bug?
邀月注:本文版權由邀月和CSDN共同所有,轉載請註明出處。
助人等於自助! [email protected]