c# - 返回从存储过程中仅一个命令删除的行数

标签 c# sql-server stored-procedures

我的存储过程正在返回一些其他数字,但我不太明白。程序如下:

CREATE PROCEDURE DeleteCandidate(@candidate_id int) AS
BEGIN
    DECLARE @NumCandidatesDeleted AS int;
    SET @NumCandidatesDeleted = 0;
    SET XACT_ABORT ON;
    BEGIN TRANSACTION ucDelCand

        /* I've removed some code from here for brevity */

        DELETE FROM [answers] WHERE [candidate_id] = @candidate_id;
        DELETE FROM [documents] WHERE [candidate_id] = @candidate_id;

        DELETE FROM [candidates] WHERE [candidate_id] = @candidate_id;

        SET @NumCandidatesDeleted = @@ROWCOUNT;

    COMMIT TRANSACTION ucDelCand

    SELECT @NumCandidatesDeleted;
END

这是我的 C# (winforms) 调用代码:

var cmd = new SqlCommand("DeleteCandidate", conn);
cmd.Parameters.AddWithValue("@candidate_id", CandidateId);

var rows = cmd.ExecuteScalar(); // This seems to return a variety of int values

我还在 SP 中尝试了 RETURN (@NumCandidatesDeleted)。我错过了什么?!!

编辑:
我只想返回删除的候选人数。即最终 delete 中受影响的行。

解决方案(问题?):
答案是:我发布的代码应该按预期工作。
问题 是“我为简洁起见删除的代码”(抱歉)。我仍然不会发布所有内容,好吧......简洁。但是,有问题的行是前面的附加 SELECT 语句。因此,当 ExecuteScalar 被调用时,它给了我第一个 SELECT 而不是最后一个。

对于处于类似困境中的下一个好奇者 - 请务必在 SQL Server Management Studio 中尝试您的存储过程。如果您删除代码以使其更简洁...请说明您所做的(再次抱歉。)。


感谢所有回答和回复的人。帮助很大。希望下一个受存储过程返回值困扰的猴子能找到这个并得到帮助!

最佳答案

您可以尝试重构存储过程以包含一个 OUTPUT 参数: 由于 @@ROWCOUNT 返回受最后一条语句影响的行数,您需要使用 @@ROWCOUNT 值填充您的变量,然后在每个删除语句后将其递增到捕获正确的删除行数。您可以阅读更多关于 @@ROWCOUNT 的信息在 MSDN 上:

CREATE PROCEDURE DeleteCandidate 
      @candidate_id INT, 
      @total_deletions INT OUTPUT 
AS
BEGIN
    DECLARE @NumCandidatesDeleted AS int;
    SET @NumCandidatesDeleted = 0;
    SET XACT_ABORT ON;
    BEGIN TRANSACTION ucDelCand

        DELETE FROM [answers] WHERE [candidate_id] = @candidate_id;
        SELECT @NumCandidatesDeleted = @@ROWCOUNT;

        DELETE FROM [documents] WHERE [candidate_id] = @candidate_id;
        SELECT @NumCandidatesDeleted = @NumCandidatesDeleted + @@ROWCOUNT;

        DELETE FROM [candidates] WHERE [candidate_id] = @candidate_id;
        SELECT @NumCandidatesDeleted = @NumCandidatesDeleted + @@ROWCOUNT;    

    COMMIT TRANSACTION ucDelCand

    SELECT @NumCandidatesDeleted;
END

C#

var cmd = new SqlCommand("DeleteCandidate", conn);
cmd.Parameters.AddWithValue("@candidate_id", CandidateId);
SqlParameter output = new SqlParameter("@total_deletions", SqlDbType.Int);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);
cmd.ExecuteNonQuery();
var rows = output.Value;

关于c# - 返回从存储过程中仅一个命令删除的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28027572/

相关文章:

SQL 存储过程 : If variable is not null, 更新语句

sql-server - 仅返回具有存储过程的数据库名称

c# - 从 DateTime c# 中的 Ticks 获取毫秒数

c# - vb.net至C#代码转换

c# - 在另一个接口(interface) C# 中使用 List<interface>

c# - 自动化 CSS 分析 - 哪些属性可以包含 URL?

sql-server - SQL Server 2008中选择 View 和联合并陷入死锁

sql-server - 在构建的动态字符串查询中使用 UNPIVOT

asp.net - 将 SQL 查询存储在资源文件中是一种不好的做法吗?

c# - 由于没有 Sql Server 数组参数,最好的处理方法是什么?