在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; }