使用ADO.NET删除数据库记录前,如何检查记录是否存在?
在ADO.NET删除前检查记录是否存在的几种实现方式
给你几个实用的方案,根据业务场景选择:
方案1:利用ExecuteNonQuery返回值判断(最简单高效)
ExecuteNonQuery()会返回SQL操作影响的行数,要是返回0,就说明没有匹配的记录可删。直接修改你的代码即可:
[HttpDelete] public IActionResult DeletePeople(int id) { string connectionString = _configuration["ConnectionStrings:DefaultConnection"]; using(SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand("spDeletePeople", connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@tnId", id); connection.Open(); int affectedRows = cmd.ExecuteNonQuery(); // using块会自动释放连接,无需手动Close } if (affectedRows == 0) { return NotFound($"ID为{id}的记录不存在"); } return Ok("删除成功"); }
注意:该方案的前提是spDeletePeople存储过程只会删除匹配@tnId的记录,没有额外逻辑导致受影响行数不准。
方案2:先查询再删除(适合需要额外业务检查的场景)
如果删除前要做其他校验(比如检查该记录是否有关联数据),可以先查询记录是否存在:
[HttpDelete] public IActionResult DeletePeople(int id) { string connectionString = _configuration["ConnectionStrings:DefaultConnection"]; using(SqlConnection connection = new SqlConnection(connectionString)) { // 检查记录是否存在 SqlCommand checkCmd = new SqlCommand("SELECT COUNT(1) FROM People WHERE tnId = @tnId", connection); checkCmd.Parameters.AddWithValue("@tnId", id); connection.Open(); int recordCount = (int)checkCmd.ExecuteScalar(); if (recordCount == 0) { return NotFound($"ID为{id}的记录不存在"); } // 执行删除 SqlCommand deleteCmd = new SqlCommand("spDeletePeople", connection); deleteCmd.CommandType = CommandType.StoredProcedure; deleteCmd.Parameters.AddWithValue("@tnId", id); deleteCmd.ExecuteNonQuery(); } return Ok("删除成功"); }
⚠️ 注意:这种方式存在并发风险——如果查询后到删除前,这条记录被其他请求删除,删除操作会返回0行影响,但你已经返回了成功。高并发场景下不推荐,优先选方案1或3。
方案3:修改存储过程,内置检查逻辑(最安全,无并发问题)
把检查和删除放到同一个存储过程里,保证操作的原子性(不会出现中间被删的情况),示例存储过程代码:
CREATE PROCEDURE spDeletePeople @tnId INT AS BEGIN SET NOCOUNT ON; -- 先判断记录是否存在 IF NOT EXISTS(SELECT 1 FROM People WHERE tnId = @tnId) BEGIN SELECT 0 AS OperationResult; RETURN; END -- 执行删除 DELETE FROM People WHERE tnId = @tnId; SELECT 1 AS OperationResult; END
然后在C#代码里读取存储过程的返回结果:
[HttpDelete] public IActionResult DeletePeople(int id) { string connectionString = _configuration["ConnectionStrings:DefaultConnection"]; using(SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand("spDeletePeople", connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@tnId", id); connection.Open(); int operationResult = (int)cmd.ExecuteScalar(); if (operationResult == 0) { return NotFound($"ID为{id}的记录不存在"); } } return Ok("删除成功"); }
这种方案最可靠,因为检查和删除在同一个数据库事务中(单个存储过程默认是原子操作),不会出现并发导致的不一致问题。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

