我的存储过程正在返回一些其他数字,但我不太明白。程序如下:
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/