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#代码中判断更新是否生效:
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; -- 返回受影响的行数 ENDint affectedRows = await Connection.ExecuteAsync(...); if(affectedRows == 0) { // 处理未找到记录的场景,比如抛出异常 } - 测试时打印参数值,快速定位参数传递类错误。
内容的提问来源于stack exchange,提问作者sebsmgzz
相关产品推荐
相关产品推荐

