我试图从.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。
提前致谢
答案 0 :(得分:3)
您将OUTPUT参数与返回值混淆。
返回值是通过RETURN
命令传回的INT。这应该用于"退出代码"关于proc的执行而不是实际的数据(尽管人们经常使用它来传递数据,而不是你想要的)。
OUTPUT参数可以是任何数据类型,并通过SET
或SELECT
填充。与输入参数一样,未指定默认值意味着它是必需的。
您得到的错误是因为您已将@Result
声明为存储过程中的OUTPUT参数,而将其声明为.NET代码中的ReturnValue(因此您未指定任何OUTPUT参数) .NET代码)。
你应该:
将return @Result
更改为RETURN;
将ParameterDirection
更改为Output
通过(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"。