日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

在 C# 中如何获取存储过程的返回值 ?

發(fā)布時(shí)間:2023/12/4 C# 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在 C# 中如何获取存储过程的返回值 ? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

咨詢區(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ǔ)句

  • select?ID,?FILE_NAME?from?dbo.FileStorage?where?ID?=?(select?max(ID)?from?dbo.FileStorage);
  • Dapper 寫法

  • var?data?=?(_dbConnection.Query<FileUploadQueryResponse>("dbo.insertFile",?whateverParameters,?commandType:?CommandType.StoredProcedure)).ToList();var?storedFileName?=?data[0].FILE_NAME;var?id?=?data[0].ID;

    為了能獲取返回值,這里我定義了一個(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。