SQL 中的输出参数不返回任何值

Output parameter in SQL not returning any value

我正在尝试 return 来自 .net 中存储过程的值,但它 return 没有任何值。

这是我的存储过程...

ALTER procedure [dbo].[usp_CreateUser]
    @UserName varchar(50),
    @Result bit output
as
begin
    declare @temp varchar(50)

    select @temp = UserName  
    from tbl_UserLoginDetails
    where UserName = @UserName

    if ((@temp is null) or (@temp=''))   
       set @Result = 1
    else
       set @Result = 0

    return @Result
end

这是我的 .net 代码..

SqlConnection vConn = new SqlConnection(ConnectionString);

SqlCommand vComm = new SqlCommand("usp_CreateUser",vConn);
vComm.CommandType = CommandType.StoredProcedure;

vComm.Parameters.AddWithValue("UserName","Tanuj");

SqlParameter retval = vComm.Parameters.Add("@Result", SqlDbType.Bit);
retval.Direction = ParameterDirection.ReturnValue;

vConn.Open();
vComm.ExecuteNonQuery();
vConn.Close();

Console.WriteLine(vComm.Parameters["@Result"].Value);

我收到以下错误...

Procedure or function 'usp_CreateUser' expects parameter '@Result', which was not supplied.

我希望它 return 0 或 1。

提前致谢

您将输出参数与 Return 值混淆了。

A Return 值是通过 RETURN 命令传回的 INT。这应该用于 "exit code" 关于 proc 的执行而不是实际数据(尽管人们经常使用它来传回数据,就像您尝试做的那样)。

OUTPUT 参数可以是任何数据类型,并通过 SETSELECT 填充。与输入参数一样,不指定默认值意味着它是必需的。

您得到的错误是因为您在存储过程中将 @Result 声明为 OUTPUT 参数,同时在 .NET 代码中将其声明为 ReturnValue(因此您是未在 .NET 代码中指定任何 OUTPUT 参数)。

你应该:

  1. return @Result改为RETURN;

  2. ParameterDirection改为Output

  3. 通过(bool)retval.Value

  4. 访问值

此外,您的存储过程代码正在做不必要的工作。它只需要是:

IF (EXISTS(
           SELECT 1
           FROM   tbl_UserLoginDetails
           WHERE  UserName = @UserName
   ))
BEGIN
  SET @Result = 0;
END;
ELSE
BEGIN
  SET @Result = 1;
END;

RETURN;

此外,仅供参考,您真的不应该使用 Parameters.AddWithValue(),因为如果 .NET 没有根据当前值正确猜测数据类型,它可能会导致问题。相反,最好使用 Parameters.Add() 以便您可以指定 SqlDbType,就像您对 "retval".

所做的那样