【问题标题】:ExecuteNonQuery always returns -1ExecuteNonQuery 总是返回 -1
【发布时间】:2016-11-13 12:12:44
【问题描述】:

我创建了一个用于删除记录的存储过程。在这个存储过程中,我首先检查要删除的数据的使用情况。如果正在使用,则存储过程将返回 -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;
        }
    }

【问题讨论】:

  • 你能发布你正在尝试的代码吗?
  • 把代码贴在你使用的地方.ExecuteNonQuery()
  • 并在Delete ,,,,语句下面添加一些返回值。
  • 我在 delete 下面做了那个返回值但是没有用
  • @mcNets 问题已更新

标签: sql-server stored-procedures executenonquery


【解决方案1】:

来自ExecuteNonQuery 文档:

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

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

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


您似乎想要做的是获取存储过程的return value。你不会从ExecuteNonQuery 的结果中得到它。请参考 StackOverflow 上的这个问题: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
    

    【讨论】:

    • 简而言之,ExecuteNonQuery 的返回值是系统保留值,您不应该尝试干预它。如果您想将自定义值从您的 SP 发送回 C# 代码,请使用输出参数并提取该值。
    • @Geethanga 这不是我的代码 :-) 我已经复制了用户的代码并突出显示了特定代码段中可能存在的问题
    【解决方案3】:

    使用cmd.ExecuteScalar() 而不是cmd.ExecuteNonQuery() ascmd.ExecuteNonQuery() 仅返回受影响的行数,而不是您选择的值。

    【讨论】:

    • 不。来自文档:Executes the query, and **returns the first column of the first row in the result set returned by the query**. Additional columns or rows are ignored.。这与返回 value 不同。
    • return -2可以改成SELECT -1
    • OP 可以做到这一点,但这通常是个坏主意。对于存储过程,最好让返回的结果集具有相同的格式(即相同的列以相同的顺序)。
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2011-12-28
    • 2017-01-20
    • 2013-02-07
    相关资源
    最近更新 更多