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

为何使用SqlDataAdapter的代码无法删除数据库指定行?

解决SqlDataAdapter无法删除指定行的问题

你的代码问题出在行的删除标记处理上:直接用Rows.Remove只是把行从内存中的DataTable集合里移除,并没有标记该行的删除状态,导致SqlDataAdapter的Update方法不会向数据库提交删除操作。

修正步骤

  • 替换行移除方式:用rowToDelete.Delete()替代table.Rows.Remove(rowToDelete),这个方法会把DataTable中的行标记为Deleted状态,SqlDataAdapter执行Update时会识别该状态,生成对应的DELETE语句提交到数据库。
  • 确认Book表存在主键:SqlCommandBuilder需要依赖表的主键信息才能自动生成正确的DELETE命令,确保id_book是Book表的主键(你直接执行SQL能删除,说明主键大概率存在,但仍需确认)。

修正后的完整代码

public static void DeleteBook(int id_book)
{
    using (var connection = new SqlConnection(DbCon.ConnectionString))
    {
        connection.Open();
        var adapter = new SqlDataAdapter("SELECT * FROM Book", connection);
        var builder = new SqlCommandBuilder(adapter);
        var table = new DataTable();
        adapter.Fill(table);

        var rowToDelete = table.Select($"id_book = {id_book}").FirstOrDefault();
        if (rowToDelete != null)
        {
            rowToDelete.Delete(); // 标记行为删除状态
            adapter.Update(table); // 提交删除操作到数据库
        }
    }
}

额外注意

如果DataTable未正确识别主键(比如表有主键但adapter.Fill时未获取到),可以手动指定DataTable的主键:

table.PrimaryKey = new DataColumn[] { table.Columns["id_book"] };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:25:09