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

时间:2018-07-08 20:44:50

标签: c# database datatable tableadapter

为什么即使清除了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后,密码会再次出现。

1 个答案:

答案 0 :(得分:0)

填充方法用于从数据库表中读取数据,并将其放入内存中的DataTable对象中。我认为您误解了清除方法和 Update 方法的工作。

Clear 方法从内存数据表中删除所有行,但不更改数据库表上的任何内容。 Update方法查看您的 PasswoerterDataTable 中存在的行,并检查其RowState属性。如果找到something to update,则将执行命令以将更改反映回数据库。
但是您已经清除了 PasswoerterDataTable 中的行,因此Update没有任何更新,并且数据库表保持不变。以下填充将重新加载所有内容。

如果要Update在数据库上执行删除命令,则需要将每行的 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();

当然,这完全没有必要,您只需编写一个Command即可直接对数据库执行操作以截断表

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