c# 从 DataTable 中删除行并使用 TableAdapter.Update 和 .Fill

c# Delete row from DataTable and use TableAdapter.Update and .Fill

为什么DataTable清空后还不为空?

一开始我清除了"PasswoerterDataTable"。但是在更新并填充它之后它不再是空的了。我是否误解了 .fill 和 .update 命令的用法?如何更正我的错误,使 "PasswoerterDataTable" 最后为空

PasswoerterDataTable.Rows.Clear();
// DataTable is now empty
PasswoerterTableAdapter.Update(PasswoerterDataTable);
PasswoerterTableAdapter.Fill(PasswoerterDataTable);
// DataTable is not empty anymore. Why?

我知道依次使用 .update 和 .fill 没有意义,但我目前正在使用 PasswordManager,我想删除密码。当程序关闭并再次启动时,这些已删除的密码不应出现,但我需要在启动后使用 .fill 来获取尚未删除的密码。但是在我使用 .fill 之后,密码又出现了。

Fill 方法用于从数据库中读取数据 table 并将其放入内存中的 DataTable 对象中。我认为您误解了 Clear 方法和 Update 方法的工作。

Clear 方法从内存数据table 中删除所有行,但不会更改数据库中的任何内容table。 Update 方法查看 PasswoerterDataTable 中的行并检查它们 RowState property. If it finds something to update 然后执行命令以将更改反映回数据库。
但是您已经清除了 PasswoerterDataTable 中的行,因此 Update 没有要更新的内容并且您的数据库 table 保持不变。以下填充重新加载所有内容。

如果你想让更新在数据库上执行删除命令,你需要将每一行的RowState设置为Deleted。你可以用

foreach(DataRow row in PasswoerterDataTable.Rows)
    row.Delete();  // This doesn't remove the row, but sets its RowState to Deleted

// Now the adapter knows what to do...
PasswoerterTableAdapter.Update();

当然这完全没有必要,您可以简单地编写一个命令直接作用于您的数据库以截断您的 table

SqlCommand cmd = new SqlCommand("TRUNCATE TABLE PasswoerterTable", connection);
cmd.ExecuteNonQuery();
PasswoerterDataTable.Rows.Clear(); 
// No need to call Fill again.