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 总是重复第一个元素的主要内容,如果未能解决你的问题,请参考以下文章

Foreach 只返回第一个值

我的 foreach 仅适用于第一个实例 [重复]

php foreach输出数组只输出元素的第一个字符

php 获得foreach中的第一个元素

php 获得foreach中的第一个元素

PowerShell foreach()基于第一个元素的多维数组