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í)有所幫助,也希望大家多多支持我們。
上一篇:詳解LINQ入門(下篇)
欄 目:C#教程
下一篇:詳解LINQ入門(上篇)
本文標(biāo)題:C# ODP.NET 調(diào)用Oracle函數(shù)返回值時報錯的一個解決方案
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4589.html
您可能感興趣的文章
- 01-10C#調(diào)用dos窗口獲取相關(guān)信息的方法
- 01-10同步調(diào)用和異步調(diào)用WebService
- 01-10C#調(diào)用WebService實例開發(fā)
- 01-10C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
- 01-10C# 調(diào)用 JavaWebservice服務(wù)遇到的問題匯總
- 01-10基于C#實現(xiàn)手機號碼歸屬地接口調(diào)用
- 01-10C#使用Process類調(diào)用外部exe程序
- 01-10Windows下C#的GUI窗口程序中實現(xiàn)調(diào)用Google Map的實例
- 01-10Windows系統(tǒng)中C#調(diào)用WinRAR來壓縮和解壓縮文件的方法
- 01-10C#基礎(chǔ)知識之base關(guān)鍵字介紹


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置