foreach 总是重复第一个元素
Posted
技术标签:
【中文标题】foreach 总是重复第一个元素【英文标题】:foreach always repeat first element 【发布时间】:2015-05-25 10:00:19 【问题描述】:我正在尝试使用数据集来更新 SQL 数据库,我正在尝试在数据集中使用 foreach,如果元素已经在数据库中,则捕获错误并继续下一个,但错误始终相同:
“System.Data.SqlClient.SqlException (0x80131904): 违反PRIMARY KEY 约束“PK_share1”。无法在对象中插入重复键 'dbo.share1'。重复键值为 (4008)。”
我不明白为什么这个 foreach 总是尝试只插入数据集的 1 个元素,而不是继续并找到一个新元素
if (changes != null)
foreach (DataRow row in changes.Tables[0].Rows)
try
adapter.Update(changes);
Console.WriteLine("Changes Done");
catch(Exception ex)
Console.WriteLine(ex.ToString());
continue;
我也试过了:
if (changes != null)
foreach (DataTable table in changes.Tables)
try
adapter.Update(changes);
Console.WriteLine("Changes Done");
catch(Exception ex)
Console.WriteLine(ex.ToString());
continue;
【问题讨论】:
请注意,adapter.Update(changes);
不引用任何表或行。它更新整个数据集。你不需要foreach
。
每次你传递相同的参数时......像adapter.Update(changes);
【参考方案1】:
在第一个代码中,您正在遍历行,但每次都更新整个 DataSet。如果你想更新DataSet,那么你不需要做多次。
if (changes != null)
try
adapter.Update(changes);
Console.WriteLine("Changes Done");
catch (Exception ex)
Console.WriteLine(ex.ToString());
在第二段代码中,您正在遍历表,但更新整个 DimSet。要逐个更新表,您应该调用adapter.Update(table);
而不是adapter.Update(changes);
。
if (changes != null)
foreach (DataTable table in changes.Tables)
try
adapter.Update(table);
Console.WriteLine("Changes Done");
catch (Exception ex)
Console.WriteLine(ex.ToString());
continue;
【讨论】:
做我想做的事:if (changes != null) try adapter.ContinueUpdateOnError = true;适配器.更新(更改); 捕捉(异常前) Console.WriteLine(ex.ToString()); 如果您设置adapter.ContinueUpdateOnError = true
,则将忽略行更新期间的错误。我宁愿尝试防止这些错误,而不是忽略它们。以上是关于foreach 总是重复第一个元素的主要内容,如果未能解决你的问题,请参考以下文章