You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dapper调用存储过程无法更新BIT类型列问题排查

问题诊断与修复:Dapper调用存储过程更新无效

核心问题

你在UpdateMetaTokenAsync方法里犯了参数传递错误:将row.TokenTypeKey传给了存储过程的@Id参数,而非目标记录的row.Id。

测试代码中构造的expected对象仅设置了Id=3和IsRevoked=true,TokenTypeKey为默认值0。这导致存储过程执行时,WHERE [Id] = @Id实际是查找Id=0的记录,而你预先插入的是Id=3的记录,因此存储过程未找到目标行,更新操作根本没执行。

修复代码

将UpdateMetaTokenAsync中的参数传递修正为row.Id:

public async Task UpdateMetaTokenAsync(MetaTokenRow row)
{
    var parameters = new DynamicParameters();
    parameters.Add("@Id", row.Id); // 从row.TokenTypeKey改为row.Id
    parameters.Add("@IsRevoked", row.IsRevoked);
    await Connection.ExecuteAsync(
        sql: "[dbo].[MetaTokens_Update]",
        param: parameters,
        commandType: CommandType.StoredProcedure,
        transaction: Transaction);
}

为什么部分测试看似正常?

你提到“将原有值从1改为0(预期false)时测试通过”,这是巧合:要么当时构造的测试对象TokenTypeKey刚好等于某个存在的Id值,要么测试数据里有Id等于默认TokenTypeKey的记录,导致存储过程误更新了那条记录,让你误以为逻辑正常。

额外调试建议

  • 给存储过程添加返回受影响行数的逻辑,在C#代码中判断更新是否生效:
    CREATE PROCEDURE [dbo].[MetaTokens_Update]
        @Id BIGINT,
        @IsRevoked BIT = NULL
    AS
    BEGIN
        SELECT 
            @IsRevoked = ISNULL(@IsRevoked, [IsRevoked])
        FROM [dbo].[MetaTokens] 
        WHERE [Id] = @Id;
    
        UPDATE [dbo].[MetaTokens] 
        SET 
            [IsRevoked] = @IsRevoked
        WHERE [Id] = @Id;
    
        RETURN @@ROWCOUNT; -- 返回受影响的行数
    END
    
    C#代码接收返回值:
    int affectedRows = await Connection.ExecuteAsync(...);
    if(affectedRows == 0)
    {
        // 处理未找到记录的场景,比如抛出异常
    }
    
  • 测试时打印参数值,快速定位参数传递类错误。

内容的提问来源于stack exchange,提问作者sebsmgzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:32:18