【问题标题】:Output parameter in SQL not returning any valueSQL中的输出参数不返回任何值
【发布时间】:2015-01-07 05:12:30
【问题描述】:

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    你应该:

    1. return @Result 更改为 RETURN;

    2. ParameterDirection 更改为Output

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多