作为学习Stored procedures
的一部分,我想出了这个。
CREATE PROCEDURE StoredProcedure1
@oResult int output
AS
BEGIN
SELECT @oResult = 2
RETURN @oResult
END
Procedure or function 'StoredProcedure1' expects parameter '@oResult', which was not supplied.
我希望此过程只是在调用时返回结果。 任何想法为什么?
EXEC StoredProcedure1 @oResult = 0
,但它只是说Command Completed Successfully
但没有输出。 任何想法为什么?
答案 0 :(得分:3)
在ADO.NET中调用需要参数的存储过程时,如果它是输出参数,则需要提供该参数。
using(SqlConnection cnn = new SqlConnection(.....))
using(SqlCommand cmd = new SqlCommand("StoredProcedure1", cnn))
{
cnn.Open();
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p = new SqlParameter("@oResult", SqlDbType.Int);
p.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
int result = Convert.ToInt32(cmd.Parameters["@oResult"].Value);
}
当然,在存储过程中,您应该以某种方式设置@oResult参数,如其他答案中所述,但如果您使用OUTPUT参数,则无需返回相同的值。
但是,如果需要,可以同时具有OUTPUT参数和RETURN值。在这种情况下,来自C#的呼叫应该是
using(SqlConnection cnn = new SqlConnection(.....))
using(SqlCommand cmd = new SqlCommand("StoredProcedure1", cnn))
{
cnn.Open();
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p = new SqlParameter("@oResult", SqlDbType.Int);
p.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p);
// Here the name @returnValue is arbitrary, you could call it whatever you like
SqlParameter r = new SqlParameter("@returnValue", SqlDbType.Int);
r.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(r);
cmd.ExecuteNonQuery();
int result = Convert.ToInt32(cmd.Parameters["@oResult"].Value);
int returnValue = Convert.ToInt32(cmd.Parameters["@returnValue"].Value);
}
答案 1 :(得分:2)
你可以这样做:
存储过程
CREATE PROCEDURE StoredProcedure1
@oResult int output
AS
BEGIN
SET @oResult = 2
END
然后这样称呼它:
DECLARE @Result INT
exec StoredProcedure1 @oResult = @Result output
SELECT @Result
这将输出
2
<强>更新强>
喜欢在评论中提到。您还可以简化声明。通过这样做:
DECLARE @Result INT
exec StoredProcedure1 @Result output
SELECT @Result
参考:
答案 2 :(得分:0)
您无需在代码下面写回复..:
CREATE PROCEDURE StoredProcedure1
@oResult int output
AS
BEGIN
SET @oResult = 2
END
答案 3 :(得分:0)
CREATE PROCEDURE SP1
(
@oResult int output
)
AS
BEGIN
SET @oResult=2
Select @oResult
END