0

我正在尝试使用以下代码删除数据集中存在的数据:

stateflowDataSet dsobject = new stateflowDataSet();
stateflowDataSetTableAdapters.dbo_statetableTableAdapter statetableadapter = new         stateflowDataSetTableAdapters.dbo_statetableTableAdapter();
statetableadapter.Fill(dsobject.dbo_statetable);
dsobject.dbo_statetable.Clear();
statetableadapter.Update(dsobject);

但是在使用此行之后statetableadapter.Fill(dsobject.dbo_statetable);,数据仍然保留。

我清除数据的方式是否正确?

代码还有其他问题吗?

4

2 回答 2

3

DataRows从 a中删除DataTable并不意味着您将从 DBMS 中删除它们。反之亦然,实际上你正在阻止它们被删除,即使你DataRow.Delete()之前会打电话。

原因是:只有DataRows属于a的DataTable可以被删除

DataAdapter.Update(table)

这将删除表中的每一行DataRowState=Deleted。因此你需要使用Delete方法

foreach(DataRow row in dsobject.dbo_statetable.Rows)
{
    row.Delete();
}
statetableadapter.Update(dsobject.dbo_statetable);

您也可以在一批中执行此操作,这样效率会更高,因此您需要将 DataAdapter 设置UpdateBatchSize为 0(无限制)。

删除所有行的另一种方法是使用简单SqlCommand的 CommandText DELETE FROM Table

using(var con = new SqlConnection(ConfigurationSettings.AppSettings["con"]))
using(var cmd = new SqlCommand())
{
    cmd.CommandText = "DELETE FROM Table";
    cmd.Connection = con;
    con.Open();
    int numberDeleted = cmd.ExecuteNonQuery();  // all rows deleted
}

现在您需要手动删除(不是删除,您的问题的核心是什么)行,DataTable因为您还在数据库中手动删除了它们:

dsobject.dbo_statetable.Clear();
于 2012-06-21T11:09:28.457 回答
2

让我试着重新措辞一下蒂姆斯的回答。DataSet当他们很受欢迎时,我经常使用s,并且对他们的“魔法”感到困惑......

Dataset包含来自数据库的数据副本 + 您对数据的更新,因为数据是从数据库中获取的。

Update()使用数据集的方法DataAdapter并不神奇,它会遍历数据集中的表,并在表中扫描行。它会:

  • DeleteCommand如果行被标记为删除,则使用
  • UpdateCommand如果行被标记为更新,则使用

前者是使用方法删除行Delete()的情况,后者是更新行中的某些单元格的情况。

如果您观察RowState数据集表中每一行的属性,您将了解更多有关该过程的信息。

于 2012-06-21T11:16:14.603 回答