SQL 中的输出参数不返回任何值
Output parameter in SQL not returning any value
我正在尝试 return 来自 .net 中存储过程的值,但它 return 没有任何值。
这是我的存储过程...
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);
我收到以下错误...
Procedure or function 'usp_CreateUser' expects parameter '@Result', which was not supplied.
我希望它 return 0 或 1。
提前致谢
您将输出参数与 Return 值混淆了。
A Return 值是通过 RETURN
命令传回的 INT。这应该用于 "exit code" 关于 proc 的执行而不是实际数据(尽管人们经常使用它来传回数据,就像您尝试做的那样)。
OUTPUT 参数可以是任何数据类型,并通过 SET
或 SELECT
填充。与输入参数一样,不指定默认值意味着它是必需的。
您得到的错误是因为您在存储过程中将 @Result
声明为 OUTPUT 参数,同时在 .NET 代码中将其声明为 ReturnValue(因此您是未在 .NET 代码中指定任何 OUTPUT 参数)。
你应该:
将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".
所做的那样
我正在尝试 return 来自 .net 中存储过程的值,但它 return 没有任何值。
这是我的存储过程...
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);
我收到以下错误...
Procedure or function 'usp_CreateUser' expects parameter '@Result', which was not supplied.
我希望它 return 0 或 1。
提前致谢
您将输出参数与 Return 值混淆了。
A Return 值是通过 RETURN
命令传回的 INT。这应该用于 "exit code" 关于 proc 的执行而不是实际数据(尽管人们经常使用它来传回数据,就像您尝试做的那样)。
OUTPUT 参数可以是任何数据类型,并通过 SET
或 SELECT
填充。与输入参数一样,不指定默认值意味着它是必需的。
您得到的错误是因为您在存储过程中将 @Result
声明为 OUTPUT 参数,同时在 .NET 代码中将其声明为 ReturnValue(因此您是未在 .NET 代码中指定任何 OUTPUT 参数)。
你应该:
将
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".