C# SqlDataAdapter的Update报错问题

我想对数据库中的2行进行一个位置的交换,使用Update提交整表的方式
测试表:ID(非自增主键),Name(内容)
表内已有1条数据:001,name1
操作:查询出表内数据,然后对DataTable进行删除,然后新增操作(这个方法试过,单独删除、新增都没问题)
实际提交我发现并没有先执行删除操作。我把主键删除后,发现只插入了没删除。
这是个什么情况,使用SqlDataAdapter进行Update操作只能执行一种逻辑吗


            DataTable dt = new DataTable();
            //DataTable数据是查出来的
            //删除第0行,0行数据001,name1,001所在列是非自增主键
            dt.Rows[0].Delete();
            DataRow row = dt.NewRow();
            row[0] = "001";//赋值为刚才删除的主键值
            dt.Rows.InsertAt(row, 0);

            SqlConnection con = new SqlConnection("");
            SqlDataAdapter adp = new SqlDataAdapter("select * from 测试表", con);
            new SqlCommandBuilder(adp);
            //对dt进行更新
            adp.Update(dt);//dt上面先删除一行,然后新增一行
            //报错:主键重复,尝试:删除主键发现,delete的行并没有删除

Update的时候会循环执行,而你用insert把新行放到了第0行的位置上,所以会先执行insert后执行delete
而insert报错了所以delete也 没有执行

参考GPT和自己的思路:

根据你的描述和代码,你使用了SqlDataAdapter的Update方法来对DataTable进行操作,在使用Delete方法删除指定行后新增一行数据,提交更新操作时发现删除操作并没有执行,只执行了新增操作。出现这种情况可能是因为SqlDataAdapter只执行了针对数据的更改操作。在这个例子中,Delete方法只是将行的状态从未更改变成删除状态,但是该行并没有从DataTable中删除,因此在提交更新时,SqlDataAdapter并没有执行删除操作,只执行了新增操作。

解决方法是在删除行后调用DataTable的AcceptChanges方法,将已删除的行从DataTable中删除,并更新行状态。然后再执行新增操作和提交更新操作即可。具体的代码示例如下:

dt.Rows[0].Delete();
dt.AcceptChanges();  // 将已删除的行从DataTable中删除,并更新行状态
DataRow row = dt.NewRow();
row[0] = "001"; //赋值为刚才删除的主键值
dt.Rows.InsertAt(row, 0);

SqlConnection con = new SqlConnection("");
SqlDataAdapter adp = new SqlDataAdapter("select * from 测试表", con);
new SqlCommandBuilder(adp);

adp.Update(dt); // 提交DataTable的更新操作

这样就可以成功执行删除和新增操作,并且修改已经提交到数据库中了。