我尝试使用以下代码删除数据集中的数据:
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);
之后,此行仍然保留。
我清算数据的方式是正确的吗?
代码还有其他问题吗?
答案 0 :(得分:3)
从DataRows
删除DataTable
并不意味着您将从DBMS中删除它们。事实恰恰相反,即使您之前曾调用DataRow.Delete()
,实际上也是在阻止它们被删除。
原因是:{/ 1}}只能删除属于DataRows
的{{1}}
DataTable
这将使用DataRowState=Deleted
删除表格中的每一行。
因此,您需要使用Delete
method。
DataAdapter.Update(table)
您也可以在一个批处理中更有效率,因此您需要将DataAdapter的UpdateBatchSize
设置为0(无限制)。
删除所有行的另一种方法是使用带有CommandText foreach(DataRow row in dsobject.dbo_statetable.Rows)
{
row.Delete();
}
statetableadapter.Update(dsobject.dbo_statetable);
的简单SqlCommand
:
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
}
中的行,因为您还在数据库中手动删除了 / p>
DataTable
答案 1 :(得分:2)
让我尝试重新措辞蒂姆回答一下。当他们受欢迎时我使用了DataSet
很多,并且与他们的“魔法”相混淆......
Dataset
包含数据库中的数据副本+数据更新,因为数据是从数据库中提取的。
Update()
上的 DataAdapter
方法不是魔术,它会遍历数据集中的表格,而会在表格中扫描行。它会:
DeleteCommand
UpdateCommand
使用Delete()
方法删除行时会出现前一种情况,稍后更新行中的某个单元格时会出现这种情况。
如果您观察数据集表中每行的RowState
属性,您将了解该过程。