在 C# 中如何获取存储过程的返回值 ?
咨詢區(qū)
GurdeepS:
我有下面的查詢語(yǔ)句:
set?ANSI_NULLS?ON set?QUOTED_IDENTIFIER?ON goALTER?PROCEDURE?[dbo].[Validate] @a?varchar(50), @b?varchar(50)?outputASSET?@Password?=? (SELECT?Password FROM?dbo.tblUser WHERE?Login?=?@a)RETURN?@b GO編譯都是沒(méi)有問(wèn)題的,現(xiàn)在我想執(zhí)行這條sql并獲取最后的返回值,我的代碼是這樣的。
SqlConnection?SqlConn?=?new?SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyLocalSQLServer"].ConnectionString.ToString());System.Data.SqlClient.SqlCommand?sqlcomm?=?new?System.Data.SqlClient.SqlCommand("Validate",?SqlConn);string?returnValue?=?string.Empty;try{SqlConn.Open();sqlcomm.CommandType?=?CommandType.StoredProcedure;SqlParameter?param?=?new?SqlParameter("@a",?SqlDbType.VarChar);param.Direction?=?ParameterDirection.Input;param.Value?=?Username;sqlcomm.Parameters.Add(param);SqlParameter?retval?=?sqlcomm.Parameters.Add("@b",?SqlDbType.VarChar);retval.Direction?=?ParameterDirection.ReturnValue;string?retunvalue?=?(string)sqlcomm.Parameters["@b"].Value;為了簡(jiǎn)潔,我去掉了所有的異常判斷,不知道為啥 retunvalue 一直都返回 ?null ,請(qǐng)問(wèn)這段代碼是否有邏輯錯(cuò)誤?
回答區(qū)
Ravindra Vairagi:
如果你不通過(guò) select 語(yǔ)句 還要獲取 存儲(chǔ)過(guò)程 的返回值,你就必須要指定 ParameterDirection.ReturnValue 枚舉并通過(guò) ExecuteScalar 獲取返回值,參考我的案例。
CREATE?PROCEDURE?IsEmailExists@Email?NVARCHAR(20) AS BEGIN--?SET?NOCOUNT?ON?added?to?prevent?extra?result?sets?from--?interfering?with?SELECT?statements.SET?NOCOUNT?ON;--?Insert?statements?for?procedure?hereIF?EXISTS(SELECT?Email?FROM?Users?where?Email?=?@Email)BEGINRETURN?0?ENDELSEBEGINRETURN?1END END然后是 C# 代碼。
GetOutputParaByCommand("IsEmailExists")public?int?GetOutputParaByCommand(string?Command){object?identity?=?0;try{mobj_SqlCommand.CommandText?=?Command;SqlParameter?SQP?=?new?SqlParameter("returnVal",?SqlDbType.Int);SQP.Direction?=?ParameterDirection.ReturnValue;mobj_SqlCommand.Parameters.Add(SQP);mobj_SqlCommand.Connection?=?mobj_SqlConnection;mobj_SqlCommand.ExecuteScalar();identity?=?Convert.ToInt32(SQP.Value);CloseConnection();}catch?(Exception?ex){CloseConnection();}return?Convert.ToInt32(identity);}這樣就可以成功獲取 存儲(chǔ)過(guò)程 的返回值了。
Dean:
如果你的項(xiàng)目采用的是 Dapper 的話,可以參考我的實(shí)現(xiàn)。
假如下面是你存儲(chǔ)過(guò)程的語(yǔ)句
Dapper 寫法
為了能獲取返回值,這里我定義了一個(gè)復(fù)雜類型 FileUploadQueryResponse 來(lái)接受存儲(chǔ)過(guò)程的 return value。
public?class?FileUploadQueryResponse{public?string?ID?{?get;?set;?}public?string?FILE_NAME?{?get;?set;?}}點(diǎn)評(píng)區(qū)
雖然現(xiàn)代開發(fā)中很少用存儲(chǔ)過(guò)程了,但現(xiàn)實(shí)項(xiàng)目中還是有很多遺留的 存儲(chǔ)過(guò)程 存在,所以如何獲取返回值還是有必要了解一下。
總結(jié)
以上是生活随笔為你收集整理的在 C# 中如何获取存储过程的返回值 ?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 10 新特性 —— Lambda
- 下一篇: 缕一缕c#可null类型