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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 C# 中如何获取存储过程的返回值 ?相关的知识,希望对你有一定的参考价值。

咨询区

  • GurdeepS

我有下面的查询语句:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Validate]
@a varchar(50),
@b varchar(50) output

AS

SET @Password = 
(SELECT Password
FROM dbo.tblUser
WHERE Login = @a)

RETURN @b
GO

编译都是没有问题的,现在我想执行这条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 ,请问这段代码是否有逻辑错误?

回答区

  • 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 here
    IF EXISTS(SELECT Email FROM Users where Email = @Email)
    BEGIN
        RETURN 0 
    END
    ELSE
    BEGIN
        RETURN 1
    END
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 的话,可以参考我的实现。

  1. 假如下面是你存储过程的语句

select ID, FILE_NAME from dbo.FileStorage where ID = (select max(ID) from dbo.FileStorage);
  1. Dapper 写法

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

为了能获取返回值,这里我定义了一个复杂类型 FileUploadQueryResponse 来接受存储过程的 return value。

public class FileUploadQueryResponse
  
    public string ID  get; set; 
    public string FILE_NAME  get; set; 
  

点评区

虽然现代开发中很少用存储过程了,但现实项目中还是有很多遗留的 存储过程 存在,所以如何获取返回值还是有必要了解一下。

以上是关于在 C# 中如何获取存储过程的返回值 ?的主要内容,如果未能解决你的问题,请参考以下文章

C#获取存储过程的 Return返回值和Output输出参数值

从 C# 中的存储过程中获取返回值

C#获取存储过程返回值和输出参数值的方法

执行sql操作后如何获取其返回值

C# 获取 oracle 存储过程的 返回值

C# 获取 oracle 存储过程的 返回值1