在 C# 中如何获取存储过程的返回值 ?
生活随笔
收集整理的這篇文章主要介紹了
在 C# 中如何获取存储过程的返回值 ?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
咨詢區(qū)
GurdeepS:
我有下面的查詢語句:
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編譯都是沒有問題的,現(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;為了簡潔,我去掉了所有的異常判斷,不知道為啥 retunvalue 一直都返回 ?null ,請問這段代碼是否有邏輯錯誤?
回答區(qū)
Ravindra Vairagi:
如果你不通過 select 語句 還要獲取 存儲過程 的返回值,你就必須要指定 ParameterDirection.ReturnValue 枚舉并通過 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);}這樣就可以成功獲取 存儲過程 的返回值了。
Dean:
如果你的項目采用的是 Dapper 的話,可以參考我的實現(xiàn)。
假如下面是你存儲過程的語句
Dapper 寫法
為了能獲取返回值,這里我定義了一個復(fù)雜類型 FileUploadQueryResponse 來接受存儲過程的 return value。
public?class?FileUploadQueryResponse{public?string?ID?{?get;?set;?}public?string?FILE_NAME?{?get;?set;?}}點評區(qū)
雖然現(xiàn)代開發(fā)中很少用存儲過程了,但現(xiàn)實項目中還是有很多遺留的 存儲過程 存在,所以如何獲取返回值還是有必要了解一下。
總結(jié)
以上是生活随笔為你收集整理的在 C# 中如何获取存储过程的返回值 ?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 10 新特性 —— Lambda
- 下一篇: 缕一缕c#可null类型