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

我有以下查询:

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。

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

谢谢,

普拉迪普

您需要一个参数,其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 

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

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

这可能对阅读有用:

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

您需要使用不同的机制来获取数据 – 具有输出参数的ExecuteReader如何?

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

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

您必须在这样的存储过程中指定输出类型

 @IDout [int] output 

然后添加此参数

 SPParamReturnCollection sp = new SPParamReturnCollection(); sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int }); 
 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 

命名变量“@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; }