ExecuteNonQuery始终返回-1

时间:2016-11-13 12:12:45

标签: sql-server stored-procedures executenonquery

我已经创建了一个用于删除记录的存储过程。在这个存储过程中,我首先检查我要删除的数据的使用情况。如果正在使用它,则存储过程将返回-2,否则它将删除该记录。

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

3 个答案:

答案 0 :(得分:3)

来自ExecuteNonQuery文档:

  

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

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

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

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

答案 1 :(得分:2)

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

  1. 设置SET NOCOUNT ON时。从您的代码中可以清楚地看到,SET NOCOUNT OFF,所以这不是您的问题。

  2. 如果受影响的行数为空,则返回-1。在您的情况下,看起来您正在检查一个表tblBills中存在的数据并从另一个表HelperPIDNumber中删除。因此,没有匹配记录的可能性更大,也没有任何删除。

  3. 请检查上面的第2点

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

答案 2 :(得分:0)

使用mHandler = new Handler(Looper.getMainLooper()) { //your runnable } 代替cmd.ExecuteScalar()cmd.ExecuteNonQuery()只返回受影响的行数,而不是您选择的值。