ASP.NET Core HttpPut接口如何检测更新是否成功并返回BadRequest
解决方案
SqlConnection.ExecuteAsync方法会返回受影响的数据库行数,当传入不存在的ID时,这个返回值会是0,我们可以通过这个值判断是否有记录被更新:
- 先把接收返回值的变量名改得更准确(原变量名
caseInfo容易误解,因为它不是实体对象) - 添加判断逻辑:如果受影响行数为0,返回
BadRequest()(或者更符合REST规范的NotFound(),因为本质是目标资源不存在) - 同步更新
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
相关产品推荐
相关产品推荐

