使用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
相关产品推荐
相关产品推荐

