2016-11-13 79 views
1

我创建了一个用于删除记录的存储过程。在这个存储过程中,我首先检查我将要删除的数据的用法。如果正在使用它,那么存储过程将返回-2,否则它会删除记录。ExecuteNonQuery总是返回-1

但问题是,即使记录存在其返回-1,而不是-2。我也设置了NOCOUNT OFF,但不知道问题出在哪里。

我知道这个问题已经被设置NOCOUNT OFF但回答它不是为我工作

ALTER PROCEDURE [dbo].[spDeletePIDNumber] 
    @Id int 
AS 
BEGIN 
    SET NOCOUNT OFF; 

    -- Insert statements for procedure here 
    if(exists(select * from tblBills where PID = @Id)) 
    begin 
     return -2 
    end 
    else 
    begin 
     Delete from HelperPIDNumber 
     where Id = @Id 
    end 
END 

public int DeletePIDNumber(int Id) 
{ 
     try 
     { 
      int result = 0; 

      using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.connection)) 
      { 
       var cmd = new SqlCommand("spDeletePIDNumber", conn); 
       cmd.CommandType = System.Data.CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@Id", Id); 

       conn.Open(); 
       result = cmd.ExecuteNonQuery(); 
      } 

      return result; 
     } 
     catch 
     { 
      throw; 
     } 
    } 
+0

您可以发布您正在尝试的代码吗? – Geethanga

+0

后使用了'.ExecuteNonQuery()' – McNets

+0

其中的代码,并添加下面的'删除,,,,'声明了一些返回值。 – McNets

回答

3

ExecuteNonQuery文档:

执行对连接并返回一个Transact-SQL语句受影响的行数

SET NOCOUNT ON;在你的程序中明确地告诉给SQL Server 返回行数。在这种情况下,ExecuteNonQuery函数的返回值为-1。

此外,如果该过程不影响任何行,即使NOCOUNTOFF,也不会返回行计数。在这种情况下,回报也是-1。


你似乎想要做的是获取存储过程的return value。你不会从ExecuteNonQuery的结果中得到这个结果。请参考这个问题在计算器上:Getting return value from stored procedure in ADO.NET

2

一般ExecuteNonQuery将返回受影响的记录数。它会在两种情况下返回-1

  1. SET NOCOUNT ON已设置。从你的代码来看,它很清晰,你有SET NOCOUNT OFF,所以这对你的情况不是问题。

  2. 如果受影响的行数是什么,它会返回-1。在你的情况,看起来你正在检查数据存在从一个表tblBills和删除从另一个表HelperPIDNumber。所以有更多的机会会有没有匹配的记录,并没有删除。

请检查点#2上面。

if(exists(select * from tblBills where PID = @Id)) 
begin 
    return -2 
end 
else 
begin 
    Delete from HelperPIDNumber where Id = @Id 
end 
+0

简而言之,ExecuteNonQuery的返回值是一个系统保留值,您不应该试图干涉这一点。如果您想要将自定义值发送回SP的C#代码,请使用输出参数并提取该值。 – Geethanga

+0

@Geethanga这不是我的代码:-)我已经复制了用户的代码,并突出显示了代码 – Aruna

0

使用cmd.ExecuteScalar(),而不是作为cmd.ExecuteNonQuery()回报cmd.ExecuteNonQuery()唯一受影响的行数,而不是您选择的值。

+0

Nope的可能问题。从文档中:'执行查询,然后**返回查询**返回的结果集中第一行的第一列。其他列或行将被忽略。这与return **值**不一样。 –

+0

'return -2'可以改为'SELECT -1' –

+0

OP可以做到这一点,但这通常是一个坏主意。对于存储过程,返回结果集的格式相同(即相同顺序的相同列)通常是一个好主意。 –