存储过程不输出结果

时间:2014-10-08 06:45:56

标签: c# sql .net sql-server stored-procedures

作为学习Stored procedures的一部分,我想出了这个。

CREATE PROCEDURE StoredProcedure1
@oResult int output
AS 
BEGIN
  SELECT @oResult = 2
  RETURN @oResult
END
  1. 但问题在于执行此SP,它只返回类似的东西。 Procedure or function 'StoredProcedure1' expects parameter '@oResult', which was not supplied. 我希望此过程只是在调用时返回结果。
  2. 任何想法为什么?

    1. 我按原样提供,EXEC StoredProcedure1 @oResult = 0,但它只是说Command Completed Successfully但没有输出。
    2. 任何想法为什么?

4 个答案:

答案 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);
}

但请记住RETURN values are limited to Integer Expressions

答案 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