1.需求 从页面上获得多条记录到DataTable-->从DataTable里删除数据库里已有的记录--》把没有的记录插入到数据库中去。
2.实现思路:获得页面上所有记录,使用foreach循环DataTable把数据库里已有的删除掉,最后更新数据库。(放到DataTable前先判断是否在数据库中存在要好一点,这里只用来学习DataRow的方法)
3.问题:在foreach里进行循环row.delete()的是否有时候可以,有时候却不可以会报如下错误:
集合已修改;枚举操作可能无法执行。
经过调试发现问题所在了:foreach里进行循环row.delete()的时候,行的状态必须是Unchanged,才可以的,新增加的行里的状态是Added,然后抛出了刚才说的异常。
所以要使用DataTable的 AcceptChanges() 方法把新增加的行的状态置为Unchanged以确认在DataTable里的更改。然后在循环删除的行的时候Row.elete() ,这些行的状态就被置为Deleted了。不需要删除的行还得通过SetAdded()方法来置回原来的Added状态。 这样在DataAdapter里对数据源进行更新的时候,就可以把新增加的记录更新到数据库里去了。
唉,搞得真是麻烦啊
ds.表名称.AcceptChanges();
foreach (Ds表名称.表名称Row row in ds.表名称)
{
if (br.GetSome(string.Format(" and title ='{0}'", row.Title)).表名称.Count > 0)
{
row.Delete();
}
else
{
置回原来的Added状态,否则数据库更新的时候不会更新
row.SetAdded();
}
}
4整理如下:
(1)for(int i=0...) { delete} 循环删除的时候,第一行删除后,原来的第二行就成为第一行。这个问题也得注意的。
(2) delete()和Remove(row)的区别:
"在将 DataSet 或 DataTable 与 DataAdapter 和关系型数据源一起使用时,用 DataRow 的 Delete 方法移除行。Delete 方法只是在 DataSet 或 DataTable 中将行标记为 Deleted,而不会移除它。而 DataAdapter 在遇到标记为 Deleted 的行时,会执行其 DeleteCommand 方法以在数据源中删除该行。然后,就可以用 AcceptChanges 方法永久移除该行。如果使用 Remove 删除该行,则该行将从表中完全移除,但 DataAdapter 不会在数据源中删除该行。",这是MSDN上的原话。(可以看到出在DataAdapter执行的时候是修改的数据源里的,而DataTable里的修改还是要AcceptChanges()来做。)补充一下:
* remove是在datatable里移除,但不会在数据源里删除。即使使用 DataAdapter对数据源进行了更新。
* delete某行被调用后,该行将不可以再访问,调用 DataAdapter.update 的时候将从数据源里删除。在没有AcceptChanges()前它还是存在在DataTable里。
(3) AcceptChanges
“在调用 AcceptChanges 时,EndEdit 方法被隐式调用,以便终止任何编辑。如果行的 RowState 原来是“Added”或“Modified”,则 RowState 将变成“Unchanged”。” 不是很理解这个方法的目的是什么,修改了DataTable后还得确认一下,才能真正修改了DataTable
(4) SetAdd 将 DataRow 的 Rowstate 更改为 Added。如果当前行未处于 Unchanged 或 Added 状态,则将引发 InvalidOperationException 并显示一条消息,指示只能对 RowState 为 Unchanged 的 DataRow 实例调用 SetAdded。
http://www.chinapoesy.com
诗词在线 |唐诗|宋词|元曲|现代诗歌|外国诗歌
126在线阅读网
http://www.Read126.cn
126在线阅读网 人物传记、古典名著、历史书籍。。。