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

ASP.NET Core HttpPut接口如何检测更新是否成功并返回BadRequest

解决方案

SqlConnection.ExecuteAsync方法会返回受影响的数据库行数,当传入不存在的ID时,这个返回值会是0,我们可以通过这个值判断是否有记录被更新:

  1. 先把接收返回值的变量名改得更准确(原变量名caseInfo容易误解,因为它不是实体对象)
  2. 添加判断逻辑:如果受影响行数为0,返回BadRequest()(或者更符合REST规范的NotFound(),因为本质是目标资源不存在)
  3. 同步更新ProducesResponseType标注,确保和实际返回的状态码对应

修改后的代码:

[HttpPut]
[ProducesResponseType(StatusCodes.Status400BadRequest)] // 新增BadRequest对应的响应标注
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<List<CaseInformation>>> UpdateCaseInformation(UpdateCaseInformation UpdateCaseInfo)
{
    using var connection = new SqlConnection(_config.GetConnectionString("SQlServer"));

    // 接收受影响的行数,变量名更清晰
    var rowsAffected = await connection.ExecuteAsync("dbo.UpdateCaseInformationByIDSP", UpdateCaseInfo, commandType: CommandType.StoredProcedure);

    if (rowsAffected == 0)
    {
        // 无记录被更新,返回BadRequest
        return BadRequest("不存在对应ID的记录,无法完成更新");
        // 若遵循REST规范,资源不存在应返回404,可替换为:
        // return NotFound("不存在对应ID的记录");
    }

    // 若需要返回更新后的记录,需用Query类方法配合查询存储过程,示例:
    // var updatedCase = await connection.QueryFirstOrDefaultAsync<CaseInformation>("dbo.GetCaseByIDSP", new { Id = UpdateCaseInfo.Id }, commandType: CommandType.StoredProcedure);
    // return Ok(new List<CaseInformation> { updatedCase });

    return Ok();
}

补充说明:

  • ExecuteAsync仅执行非查询操作,无法返回实体数据,若需要返回更新后的记录,需使用QueryAsync或QueryFirstOrDefaultAsync配合查询类存储过程
  • 从REST设计逻辑来看,更新不存在的资源时返回404 NotFound比400 BadRequest更合理,因为错误根源是请求的资源不存在,而非请求格式错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:23:21