在C#中如何使用ExecuteNonQuery从存储过程中获取返回值

时间:2011-02-16 11:44:56

标签: c# ado.net

我有以下查询:

create proc [dbo].[DeleteParts] 
    @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
    DECLARE @Returns BIT 
    SET @Returns = 1 

    BEGIN 
       TRY  
          BEGIN TRANSACTION 

          DELETE FROM PARTABLE 
          WHERE TransNo = @TransNo and fpart = @fpart

          COMMIT 
       END TRY 
       BEGIN CATCH   
           Print 'Delete failed'    
           SET @Returns = 0      
           -- Any Error Occurred during Transaction. Rollback     
           IF @@TRANCOUNT > 0       
               ROLLBACK  -- Roll back 
       END CATCH

       RETURN @Returns

这完全合适。

在C#中,我想执行此查询并获取返回值。

我的代码如下:

using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
   deletecommand.CommandText = "DeleteParts";
   deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
   deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
   deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);

   string ReturnValue = deletecommand.ExecuteNonQuery().ToString();
}

它没有给我任何错误,但它返回受影响的行数,我想返回1或0.

示例:如果删除操作成功,则返回1,如果失败则返回0.

任何有关源代码的帮助都将不胜感激。

谢谢,

与Pradeep

8 个答案:

答案 0 :(得分:17)

您需要将Direction设置为ParameterDirection.ReturnValue

的参数

类似的东西:

SqlParameter returnParameter = deleteCommand.Parameters.Add("RetVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
...
deleteCommand.ExecuteNonQuery();
...
int returnValue = (int) returnParameter.Value;

您存储过程当然需要返回此返回值:

create proc [dbo].[DeleteParts]      
    @TransNo nvarchar (6),   
    @fpart nvarchar(25)  
AS      
DECLARE @Returns BIT      
SET @Returns = 1     
...
RETURN @Returns

答案 1 :(得分:2)

我没有看到你正在返回这个值。请添加Return语句以返回存储过程中的任何值。

答案 2 :(得分:1)

ExecuteNonQuery将返回受影响的行数但不返回数据(这就是非查询的原因)。所以它不会带回任何东西。

这可能对以下内容有用:

http://www.dreamincode.net/forums/topic/76434-executenonquery-with-output-parameters/

您需要使用其他机制来获取数据 - 带有输出参数的 ExecuteReader 如何?

答案 3 :(得分:0)

ExecuteNonQuery()会返回您无法设置的@@ROWCOUNT。所以你真的不能用它来返回值。

答案 4 :(得分:0)

通常结果作为一行返回,就像普通的select查询一样。您可以使用阅读器或适配器来获取它。

答案 5 :(得分:0)

您必须在存储过程中指定输出类型,例如

@IDout                  [int] output

然后添加此参数

SPParamReturnCollection sp = new SPParamReturnCollection();
        sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int });

答案 6 :(得分:0)

IF EXISTS(SELECT TransNo FROM [PARTABLE] WHERE TransNo = @TransNo and fpart = @fpart
        BEGIN                       
            DELETE FROM PARTABLE 
                        WHERE TransNo = @TransNo and fpart = @fpart

            SELECT @TransNo AS RETURNVAL
        END
        ELSE
        BEGIN
             SELECT 0 AS RETURNVAL
        END

答案 7 :(得分:0)

命名一个变量“@Returns”并没有神奇地返回它的值,你必须实际返回该值。

您不能返回位值,返回值始终是整数。如果要返回一个比特值,则必须使用输出参数。

在过程中添加return语句:

create proc [dbo].[DeleteParts] 
  @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
  DECLARE @Returns INT
  SET @Returns = 1 

  BEGIN 
    TRY  
      BEGIN TRANSACTION 

      DELETE FROM PARTABLE 
      WHERE TransNo = @TransNo and fpart = @fpart

      COMMIT 
    END TRY 
    BEGIN CATCH   
       Print 'Delete failed'    
       SET @Returns = 0      
       -- Any Error Occurred during Transaction. Rollback     
       IF @@TRANCOUNT > 0       
           ROLLBACK
    END CATCH

RETURN @Returns

添加方向ReturnValue的参数以接收返回值:

int returnValue;
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
   deletecommand.CommandText = "DeleteParts";
   deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
   deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
   deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);
   var returnParameter = deletecommand.Parameters.Add("@ret", SqlDbType.Int);
   returnParameter.Direction = ParameterDirection.ReturnValue;

   deletecommand.ExecuteNonQuery();
   returnValue = (int)returnParameter.Value;
}