C# 返回仅从存储过程中的一个命令中删除的行数
我的存储过程正在返回另一个数字,我不能完全理解它。程序如下:C# 返回仅从存储过程中的一个命令中删除的行数,c#,sql-server,stored-procedures,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 s
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
下面是我的WinC窗体调用代码:
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@numcandidates。我错过了什么
编辑:
我只想返回删除的候选人数。i、 e.最终删除的受影响行
解决问题?:
答案是:我发布的代码应该按预期工作。
问题是为了简洁起见我删除了代码对不起。我还是不会把它全部贴出来,因为,嗯。。。简洁但是,令人不快的一行是前面附加的SELECT语句。因此,当调用ExecuteScalar时,它给了我第一个选择,而不是最后一个选择
对于处于类似困境的下一位漫游者,请务必在SQLServerManagementStudio中尝试您的存储过程。如果您删除代码以使其更简洁…请说明这是您所做的对不起。再一次
感谢所有回答和回应的人。帮了大忙。希望下一个被存储过程返回值困住的猴子也能找到它并得到帮助 试试这个
Declare @tempTable as table
(
pkid bigint null,
tablename nvarchar(200)
)
Delete Tablename
OUTPUT Deleted.pkid,'Tablename'
INTO @tempTable
From Tablename
上述程序中的代码
CREATE PROCEDURE DeleteCandidate(@candidate_id int) AS
BEGIN
SET XACT_ABORT ON;
BEGIN TRANSACTION ucDelCand
DECLARE @tempTable as TABLE
(
pkid bigint null,
tablename nvarchar(200)
)
DELETE [answers]
OUTPUT DELETED.candidate_id, 'answers'
INTO @tempTable
FROM [answers] WHERE [candidate_id] = @candidate_id;
DELETE [documents]
OUTPUT DELETED.candidate_id, 'documents'
INTO @tempTable
FROM [documents] WHERE [candidate_id] = @candidate_id;
DELETE [candidates]
OUTPUT DELETED.candidate_id, 'candidates'
INTO @tempTable
FROM [candidates] WHERE [candidate_id] = @candidate_id;
SELECT COUNT(pkid), tablename
FROM @tempTable
GROUP BY tablename
COMMIT TRANSACTION ucDelCand
END
试试这个
Declare @tempTable as table
(
pkid bigint null,
tablename nvarchar(200)
)
Delete Tablename
OUTPUT Deleted.pkid,'Tablename'
INTO @tempTable
From Tablename
上述程序中的代码
CREATE PROCEDURE DeleteCandidate(@candidate_id int) AS
BEGIN
SET XACT_ABORT ON;
BEGIN TRANSACTION ucDelCand
DECLARE @tempTable as TABLE
(
pkid bigint null,
tablename nvarchar(200)
)
DELETE [answers]
OUTPUT DELETED.candidate_id, 'answers'
INTO @tempTable
FROM [answers] WHERE [candidate_id] = @candidate_id;
DELETE [documents]
OUTPUT DELETED.candidate_id, 'documents'
INTO @tempTable
FROM [documents] WHERE [candidate_id] = @candidate_id;
DELETE [candidates]
OUTPUT DELETED.candidate_id, 'candidates'
INTO @tempTable
FROM [candidates] WHERE [candidate_id] = @candidate_id;
SELECT COUNT(pkid), tablename
FROM @tempTable
GROUP BY tablename
COMMIT TRANSACTION ucDelCand
END
您可以尝试重构存储过程以包含输出参数: 由于@ROWCOUNT返回受上一条语句影响的行数,因此您需要使用@ROWCOUNT值填充变量,然后在每条delete语句后递增它,以捕获正确的已删除行数。您可以在MSDN上阅读更多信息: C
您可以尝试重构存储过程以包含输出参数: 由于@ROWCOUNT返回受上一条语句影响的行数,因此您需要使用@ROWCOUNT值填充变量,然后在每条delete语句后递增它,以捕获正确的已删除行数。您可以在MSDN上阅读更多信息: C
ExecuteScalar返回结果集第一行的第一列。您是否打算使用ExecuteOnQuery获取受影响的行数?如果不返回行,请使用ExecuteOnQuery,您可以重构存储过程以获得输出参数。您应该将NumCandidatesDeleted设置为输出参数。另外,您应该明确说明您的参数数据类型和值,而不是使用AddWithValue。@Lennart,如果我使用ExecuteOnQuery,将返回哪个受影响的行数?我能控制吗是否来自SP中的最后一次操作?您是否尝试硬编码该值并查看该值是否匹配?从[candidates]中删除,其中[candidate\u id]=@candidate\u id;选择@@ROWCOUNT;ExecuteScalar返回结果集第一行的第一列。您是否打算使用ExecuteOnQuery获取受影响的行数?如果不返回行,请使用ExecuteOnQuery,您可以重构存储过程以获得输出参数。您应该将NumCandidatesDeleted设置为输出参数。另外,您应该明确说明您的参数数据类型和值,而不是使用AddWithValue。@Lennart,如果我使用ExecuteOnQuery,将返回哪个受影响的行数?我能控制吗是否来自SP中的最后一次操作?您是否尝试硬编码该值并查看该值是否匹配?从[candidates]中删除,其中[candidate\u id]=@candidate\u id;选择@@ROWCOUNT;嗨@Sourav_Agasti,我想,我已经给出了正确的答案,没有必要编辑我的答案。我想,我已经给出了正确的答案,没有必要编辑我的答案。我改进了格式,没有更改原始答案。好的,不是问题,我想,这样回答我,是你认为的更好的方式吗?嗨@Sourav_Agasti,我想,我已经给出了正确的答案,没有必要编辑我的答案嗨@Sourav_Agasti,我想,我已经给出了正确的答案,没有必要编辑我的答案,我改进了格式,没有更改原始答案。好的,我想,这不是问题,我得到的答案是这样的,是更好的方法吗?使用输出感觉像是一种变通方法。我使用存储过程在其他地方返回标量。V困惑!使用输出感觉像是一种变通方法。我使用存储过程在其他地方返回标量。V困惑!