惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
L
LINUX DO - 最新话题
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
云风的 BLOG
云风的 BLOG
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
PCI Perspectives
PCI Perspectives
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Attack and Defense Labs
Attack and Defense Labs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Proofpoint News Feed
小众软件
小众软件
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
F
Fortinet All Blogs
T
Threatpost
Security Latest
Security Latest
V
Vulnerabilities – Threatpost
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
WordPress大学
WordPress大学
Forbes - Security
Forbes - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
CERT Recently Published Vulnerability Notes
AI
AI
博客园 - 三生石上(FineUI控件)
T
Threat Research - Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Schneier on Security
I
Intezer
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
V2EX
aimingoo的专栏
aimingoo的专栏
量子位
NISL@THU
NISL@THU
N
News and Events Feed by Topic
O
OpenAI News
Microsoft Azure Blog
Microsoft Azure Blog
C
Check Point Blog
Schneier on Security
Schneier on Security
S
Secure Thoughts
The Cloudflare Blog
J
Java Code Geeks

博客园 - SuperCai

Leaf'n Joy 隐私政策 Leaf'n Joy (植物灯IOSAPP) WndProc(ref Message m) [转]DllImport属性详解 [转]C#自定义控件背景色透明的方法 对C#插件接口应用的一些理解 日期时间格式化(到毫秒) UTC时间与WINDOWS时间互换 [转]C# Telnet [原]电子工程师工具箱 动态内存中加载DLL的问题 电缆电压降计算 红外对射探测器的安装方法 红外对射调试 终于想起了密码~~汗~~ 解决 Win2003 SP1 无法安装 - SuperCai .net创建windows Service步骤 用netsh自动切换IP
[转]使用foreach 循环删除DataRow的时候的问题
SuperCai · 2011-12-05 · via 博客园 - SuperCai
http://hi.baidu.com/ilovehaley/blog/item/906be189f1087fba0e24446d.html

集合已修改;枚举操作可能无法执行。使用foreach 循环删除DataRow的时候的问题!

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整理如下:

1forint 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。