C# foreach总是重复第一个元素

C# foreach总是重复第一个元素,c#,sql-server,foreach,C#,Sql Server,Foreach,我尝试使用数据集更新SQL数据库,我尝试在数据集中使用foreach,如果元素已在数据库中,则捕获错误并继续下一个,但错误始终相同: “System.Data.SqlClient.SqlException(0x80131904):违反主 密钥约束“PK_share1”。无法在对象中插入重复的密钥 “dbo.share1”。重复的键值为(4008)。” 我不明白为什么这个foreach总是三位一体,只插入数据集的一个元素,而不是继续并找到一个新的元素 if (changes != null)

我尝试使用数据集更新SQL数据库,我尝试在数据集中使用foreach,如果元素已在数据库中,则捕获错误并继续下一个,但错误始终相同:

“System.Data.SqlClient.SqlException(0x80131904):违反主 密钥约束“PK_share1”。无法在对象中插入重复的密钥 “dbo.share1”。重复的键值为(4008)。”

我不明白为什么这个foreach总是三位一体,只插入数据集的一个元素,而不是继续并找到一个新的元素

 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;
                        }

                    }
                }

在第一段代码中,您将遍历行,但每次都会更新整个数据集。如果要更新数据集,则不需要多次更新

if (changes != null)
{
    try
    {
        adapter.Update(changes);
        Console.WriteLine("Changes Done");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}
在第二段代码中,您将遍历表,但会更新整个DimSet。要逐个更新表,您应该调用
adapter.update(table)而不是
适配器。更新(更改)


注意,
adapter.Update(更改)不引用任何表或行。它会更新整个数据集。您不需要foreach的
foreach
。每次传递相同的参数时。。。更改,如adapter.Update(更改);要做我想做的事情,我必须输入:if(changes!=null){try{adapter.ContinueUpdateOnError=true;adapter.Update(changes);}catch(Exception ex){Console.WriteLine(ex.ToString());}}如果设置
adapter.ContinueUpdateOnError=true
,则行更新期间的错误将被忽略。我宁愿努力避免这些错误,而不是仅仅忽略它们。
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;
        }
    }
}