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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:03:17