Dapper returns 阴性结果

Dapper returns negative result

我对 dapper return在 sp 调用中使用 -1 而不是 1 有点困惑。

存储过程如下:

CREATE PROCEDURE [dbo].[spIncrementUserAccessFailedCount]
@UserId INT,
@ConcurrencyStamp UNIQUEIDENTIFIER,

@IncrementCount INT OUTPUT,
@ConcurrencyStampNew UNIQUEIDENTIFIER OUTPUT
AS
  BEGIN
    SET NOCOUNT ON;

    BEGIN TRY

    IF NOT EXISTS(SELECT * FROM [dbo].[User] WHERE [UserId] = @UserId AND [ConcurrencyStamp] = @ConcurrencyStamp)
        RAISERROR('ConcurrencyStamp is not valid.',18,1) WITH NOWAIT;

    UPDATE [dbo].[User]
    SET 
        @IncrementCount = [AccessFailedCount] = [AccessFailedCount] + 1, 
        @ConcurrencyStampNew = [ConcurrencyStamp] = NEWID() 
    WHERE [UserId] = @UserId
    RETURN 1;

END TRY

BEGIN CATCH

    THROW

END CATCH
END

这是我调用 sp 的 c# 代码:

    public async Task IncrementAccessFailedCountAsync(User user)
    {
        DynamicParameters parms = new DynamicParameters();
        parms.Add("UserId", user.UserId);
        parms.Add("ConcurrencyStamp", user.ConcurrencyStamp);

        parms.Add("IncrementCount", null, DbType.Int32, direction: ParameterDirection.Output);
        parms.Add("ConcurrencyStampNew", null, DbType.Guid, direction: ParameterDirection.Output, size: 40);

        var result = await _dataAcces.SaveData("dbo.spIncrementUserAccessFailedCount", parms, _connectionString.SqlIdentityConnectionName);

        if (result == 1)
        {
            user.ConcurrencyStamp = parms.Get<Guid>("ConcurrencyStampNew");
            user.AccessFailedCount = parms.Get<int>("IncrementCount");
        }
    }

这是我的小巧玲珑的包装纸:

    public async Task<int> SaveData<U>(string sql, U parameters, string connectionStringName)
    {
        string connectionString = _configuration.GetConnectionString(connectionStringName);

        using (IDbConnection connection = new SqlConnection(connectionString))
        {
            return await connection.ExecuteAsync(sql, parameters, commandType: CommandType.StoredProcedure);
        }
    }

但是结果值为-1。

FailedCount 和 ConcurencyStam 在数据库中已更改,但由于 if 块而未 returned。我知道 returns 受影响的行数和“SET NOCOUNT ON”,我认为它会 return 改为“RETURN 1”值。我可以强制它这样做吗?

问题是 Dapper 试图获取更改的行数,当您调用 PROCEDURE 时,命令更改的行数为 -1。你想从存储过程中获取 return 代码,你可以使用类似 this

在你的情况下它会是这样的;

    public async Task<int> SaveData<U>(string sql, U parameters, string connectionStringName)
    {
        string connectionString = _configuration.GetConnectionString(connectionStringName);
        using (IDbConnection connection = new SqlConnection(connectionString))
        {
            parameters.Add("RetVal", null, DbType.Int32, direction: ParameterDirection.ReturnValue);
            var returnCode = connection.Execute(sql, parameters, commandType: CommandType.StoredProcedure);
            return parameters.Get<int>("@RetVal");
        }
    }