ExecuteNonQuery 总是 returns -1

ExecuteNonQuery always returns -1

我创建了一个删除记录的存储过程。在此存储过程中,我首先检查要删除的数据的使用情况。如果正在使用,则存储过程将 return -2 否则删除记录。

但问题是即使是记录也存在其 return -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;
        }
    }

来自 ExecuteNonQuery 文档:

Executes a Transact-SQL statement against the connection and returns the number of rows affected.

在您的程序中有 SET NOCOUNT ON; 明确告诉 SQL 服务器 而不是 到 return 行计数。在这种情况下,ExecuteNonQuery 函数的 return 是 -1。

此外,如果该过程不影响任何行,即使 NOCOUNTOFF,它也不会 return 行计数。在这种情况下,return 也将为 -1。


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

通常 ExecuteNonQuery 将 return 条受影响的记录。它会 return -1 在两种情况下:

  1. SET NOCOUNT ON已经设置。从你的代码来看,很明显,你有 SET NOCOUNT OFF 所以这不是你的问题。

  2. 如果受影响的行数没有,它将 return -1。在您的情况下,看起来您正在检查一个 table tblBills 中的数据是否存在并从另一个 table HelperPIDNumber 中删除。所以更有可能没有匹配的记录并且没有被删除。

请检查上面的点#2

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

使用 cmd.ExecuteScalar() 而不是 cmd.ExecuteNonQuery(),因为 cmd.ExecuteNonQuery() return 只有受影响的行数,而不是您选择的值。