Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回仅从存储过程中的一个命令中删除的行数_C#_Sql Server_Stored Procedures - Fatal编程技术网

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困惑!