我有以下查询:
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
答案 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;
}