博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合已修改;枚举操作可能无法执行。使用foreach 循环删除DataRow的时候的问题! 该死的AcceptChanges() Row.elete() Remove(Row)使用不同。...
阅读量:7114 次
发布时间:2019-06-28

本文共 1797 字,大约阅读时间需要 5 分钟。

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里对数据源进行更新的时候,就可以把新增加的记录更新到数据库里去了。
唉,搞得真是麻烦啊

//
前面已动态添加到table里了。下面的会added行的状态进行修改Unchanged,以便循环的时候可以删除。
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。

你可能感兴趣的文章
iOS弹幕高效加载实现方式
查看>>
带你搭一个SpringBoot+SpringData JPA的环境
查看>>
区块链软件:区块链正逐渐产业化和大众化
查看>>
java版b2b2c社交电商spring cloud分布式微服务(二)服务消费者(rest+ribbon)
查看>>
java版b2b2c社交电商springcloud分布式微服务 (九)服务链路追踪(Spring Cloud Sleuth)...
查看>>
【转】PO、POJO、BO、DTO、VO之间的区别
查看>>
3分钟构建开发、测试、生产L(Alpine Linux ) + N(Nginx) + M(MariaDB) + P(PHP) Docker
查看>>
Python爬取并简单分析鱼油数据
查看>>
支付宝启用人工智能客服 能力媲美大学生
查看>>
ConfigParser配置文件
查看>>
BCH正式升级,智能合约,逐梦而来!
查看>>
json-handle:json可视化工具
查看>>
Crypto++ 编码与哈希(StringSource和FileSource)
查看>>
c语言指针闲谈
查看>>
随记:Ubuntu12.04下手工配置网络
查看>>
微软整合实验(四):迁移FSMO操作主机角色,基于Server 2008 R2
查看>>
主从mysql遇到的问题,
查看>>
iptables 禁止端口和开放端口
查看>>
Linux软件包管理之rpm
查看>>
30. PowerShell -- 后台作业、异步操作实例
查看>>