国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# ODP.NET 調用Oracle函數返回值時報錯的一個解決方案

2020-01-24 00:01:23
字體:
來源:轉載
供稿:網友

有人在社區問到: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?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 威信县| 二连浩特市| 宜兰市| 新平| 满洲里市| 潼南县| 昭通市| 祥云县| 和田县| 应城市| 历史| 怀集县| 湖州市| 蒙自县| 景宁| 清徐县| 葫芦岛市| 普宁市| 金沙县| 聂拉木县| 岱山县| 应用必备| 朝阳市| 穆棱市| 神池县| 临洮县| 尉犁县| 廉江市| 徐水县| 河池市| 石楼县| 光山县| 南投县| 吴旗县| 方山县| 彝良县| 富阳市| 左云县| 织金县| 辽阳市| 山阴县|