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

时间:2015-01-07 05:12:31

标签: .net sql-server ado.net output-parameter

我试图从.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。

提前致谢

1 个答案:

答案 0 :(得分:3)

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

返回值是通过RETURN命令传回的INT。这应该用于"退出代码"关于proc的执行而不是实际的数据(尽管人们经常使用它来传递数据,而不是你想要的)。

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

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

你应该:

  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"。