【问题标题】:Entity Framework Core DbContext.Database.ExecuteSqlRawAsync() returns -1 as "rowsAffected" return value. What does this mean?Entity Framework Core DbContext.Database.ExecuteSqlRawAsync() 返回 -1 作为“rowsAffected”返回值。这是什么意思?
【发布时间】:2021-09-10 19:43:57
【问题描述】:

当我使用 Entity Framework Core 在 MSQL Server 中调用存储过程时,我得到一个返回值 -1。这是受影响的行数。

首先,这是错误的,因为我的存储过程从表中删除了多个条目。对我来说更奇怪的是该值是负数。通常我会假设这表示错误,但我的存储过程已执行并且数据按预期更改。

这是我的 C# 代码:

var rowsAffected = await this.dbContext.Database.ExecuteSqlRawAsync("dbo.sp_DeleteSomeStuff").ConfigureAwait(false);

存储过程如下所示:

CREATE PROCEDURE sp_DeleteSomeStuff
AS
BEGIN
    BEGIN TRANSACTION;
        DECLARE @result int;
        EXEC @result = sp_getapplock @Resource = 'DeleteSomeStuffLock',
                                     @LockOwner='Transaction',
                                     @LockMode = 'Exclusive';

        -- result code 0 or 1 = success (error codes are negative)
        IF @result >= 0
        BEGIN
            SET NOCOUNT ON;

            DELETE FROM [dbo].[MyTable] 
            WHERE [Expiration] < (CURRENT_TIMESTAMP);

            COMMIT TRANSACTION;
        END
        ELSE
        BEGIN
            ROLLBACK TRANSACTION;
        END;

        RETURN @result;
END
GO

-1 是什么意思?有没有办法从我的存储过程中获取受影响行的实际计数?

【问题讨论】:

标签: c# sql sql-server stored-procedures entity-framework-core


【解决方案1】:

正如 cmets 中所指出的,SET NOCOUNT ON; 语句阻止了受影响的行数。从存储过程中删除这条语句解决了这个问题。

【讨论】:

  • 评论解释了它,但没有说你必须设置 nocount on。我宁愿依靠@@ROWCOUNT
【解决方案2】:

删除 SET NOCOUNT ON 解决了 -1 问题并返回正确的受影响行数。

但不确定是否最好将SET NOCOUNT ONreturn @@ROWCOUNT 作为存储过程的输出删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2012-09-06
    • 1970-01-01
    • 2013-04-25
    • 2021-01-24
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多