C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案
有人在社區(qū)問(wèn)到:C#調(diào)用Oracle中自定義函數(shù)的返回值時(shí),無(wú)法正常調(diào)用。但在PL/SQL中正常調(diào)用返回。
于是動(dòng)手一試:
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、核心訪問(wèn)代碼:
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ù)對(duì)象
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ù)庫(kù)表
cmd.CommandType = CommandType.StoredProcedure;
objConn.Open();
/***************************************************************
* 注意,輸出參數(shù)一定要第一個(gè)加,函數(shù)的返回值也是賦給第一個(gè)參數(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();
}
}
}
}
運(yùn)行調(diào)試,沒(méi)報(bào)錯(cuò),但也沒(méi)有更新數(shù)據(jù)表,注意:在執(zhí)行前先將原數(shù)據(jù)表中Grade值更新為1,程序運(yùn)行后Grade值仍為1。
update testdb3 set grade=1 where PKID=1;
跟蹤調(diào)試,發(fā)現(xiàn)參數(shù)值不對(duì), p2.Direction = ParameterDirection.ReturnValue;,結(jié)果返回值給p1。
莫非,默認(rèn)給的是第一個(gè)參數(shù),調(diào)換p1,p2的順序,果然正常調(diào)用:
運(yùn)行結(jié)果,數(shù)據(jù)表中的行也更新完成:
小結(jié):
Oracle.ManagedDataAccess.Client調(diào)用有返回值的函數(shù)時(shí),cmd.Parameters.Add的第一個(gè)參數(shù)一定要是ParameterDirection.ReturnValue。不確定這是不是一個(gè)bug?
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
欄 目:C#教程
本文標(biāo)題:C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/4589.html
您可能感興趣的文章
- 01-10C#調(diào)用dos窗口獲取相關(guān)信息的方法
- 01-10同步調(diào)用和異步調(diào)用WebService
- 01-10C#調(diào)用WebService實(shí)例開(kāi)發(fā)
- 01-10C++調(diào)用C#的DLL程序?qū)崿F(xiàn)方法
- 01-10C# 調(diào)用 JavaWebservice服務(wù)遇到的問(wèn)題匯總
- 01-10基于C#實(shí)現(xiàn)手機(jī)號(hào)碼歸屬地接口調(diào)用
- 01-10C#使用Process類(lèi)調(diào)用外部exe程序
- 01-10Windows下C#的GUI窗口程序中實(shí)現(xiàn)調(diào)用Google Map的實(shí)例
- 01-10Windows系統(tǒng)中C#調(diào)用WinRAR來(lái)壓縮和解壓縮文件的方法
- 01-10C#基礎(chǔ)知識(shí)之base關(guān)鍵字介紹


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置


