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

使用Dapper执行Update请求时返回值为0是否符合预期?

疑问:Dapper ExecuteAsync在数据未变更时返回0是否为预期行为?

我使用以下代码更新用户表:

var query = @"UPDATE users SET firstname = @firstname, lastname = @lastname WHERE id = @userId"; 
var updated = await con.ExecuteAsync(query, new { firstname = user.firstname, lastname = user.lastname, userId = user.id }); 
return updated > 0;

遇到的情况是:当传入的数据与数据库中现有数据相同时,updated返回0;数据不同时返回1。具体示例:

  • 首次尝试:firstname = "John",lastname = "Doe",userId = 1,返回结果为1
  • 第二次尝试:参数与首次完全相同,返回结果为0
  • 第三次尝试:firstname = "Johny",lastname = "Doe",userId = 1,返回结果为1

请问这是预期行为吗?


是的,这完全是预期行为。

原因很直接:ExecuteAsync返回的是数据库执行UPDATE语句后实际受影响的行数。当你传入的参数和数据库里已有的数据完全一致时,数据库不会做任何实际的更新操作——毕竟数据没变化,没必要修改磁盘上的记录。这种情况下,受影响行数自然是0,Dapper只是把数据库返回的这个值原封不动传递给你。

反过来,当数据存在差异时,数据库会修改对应的行,此时受影响行数为1,所以updated返回1。

如果你的业务逻辑需要判断「是否找到了对应的用户记录」而不是「是否实际更新了数据」,可以考虑两种方案:

  • 先执行一个SELECT查询,检查该userId的记录是否存在
  • 修改UPDATE语句,借助数据库特定语法获取是否命中了记录(比如SQL Server的OUTPUT子句,或者MySQL调整相关设置后用ROW_COUNT()判断)

但如果你的需求就是确认数据是否被修改,那当前的返回值逻辑完全正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:20:23