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

推荐订阅源

博客园 - Franky
W
WeLiveSecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Security Affairs
SecWiki News
SecWiki News
T
Tenable Blog
C
CERT Recently Published Vulnerability Notes
Forbes - Security
Forbes - Security
Google Online Security Blog
Google Online Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
PCI Perspectives
PCI Perspectives
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
Cyberwarzone
Cyberwarzone
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
V
Vulnerabilities – Threatpost
宝玉的分享
宝玉的分享
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
V
Visual Studio Blog
T
Threatpost
Project Zero
Project Zero
Know Your Adversary
Know Your Adversary
I
InfoQ
G
Google Developers Blog
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
TaoSecurity Blog
TaoSecurity Blog
O
OpenAI News
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tor Project blog
Schneier on Security
Schneier on Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net
Security Latest
Security Latest
Attack and Defense Labs
Attack and Defense Labs
aimingoo的专栏
aimingoo的专栏
H
Heimdal Security Blog

博客园 - 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。