0

我试图从.net 中的存储过程返回一个值,但它不返回任何值。

这是我的存储过程...

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);

我收到以下错误...

过程或函数“usp_CreateUser”需要参数“@Result”,但未提供该参数。

我希望它返回 0 或 1。

提前致谢

4

1 回答 1

3

您将 OUTPUT 参数与返回值混淆了。

返回值是通过RETURN命令传回的 INT。这应该用于有关 proc 执行的“退出代码”,而不是实际数据(尽管人们经常使用它来传回数据,就像您尝试做的那样)。

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

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

你应该:

  1. 改变return @Result只是RETURN;

  2. 更改ParameterDirectionOutput

  3. 通过访问值(bool)retval.Value


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

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()这样您就可以指定 a SqlDbType,就像您对“retval”所做的那样。

于 2015-01-07T05:33:50.907 回答