2015-01-07 40 views
0

我想从.net中的存储过程返回一个值,但它不返回任何值。SQL中的输出参数不返回任何值

这里是我的存储过程...

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',它没有提供。

我期待它提前

回答

3

返回0或1

感谢您与返回值混淆输出参数。

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

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

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

您应该:

  1. 变化return @Result是公正RETURN;

  2. 通过(bool)retval.Value

变化 ParameterDirectionOutput

  • 访问值


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

    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”所做的一样。