为何使用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
相关产品推荐
相关产品推荐

