【已解决】循环插入InsertOnSubmit Submitchanges时出现过一次异常信息:违反了 PRIMARY KEY 约束 。不能在对象 中插入重复键。后一直报重复错误

本文探讨了使用ORM框架时遇到的重复提交错误问题,详细解释了错误产生的原因,并提供了一种有效的解决方案,即在捕获异常后删除引起冲突的数据记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一旦出现某一行重复,

 rtx.SubmitChanges();会报重复错误
但是接下去 不重复的行  也会报重复错误

原因是:

rtx.SubmitChanges()时把之前InsertOnSubmit的也提交了。

//伪代码

//Row 3是重复行

try{

for(int Row=1;Row<=5;Row++)

{

InsertOnSubmit(Row);

Submitchanges();

}

}

catch

{

write log;

}


提交Row3时会报错,并讲错误信息写入日志

开始第四行

但是在第四行时提交也会报错,原因是之前

InsertOnSubmit了Row3


在Row4 Insert 并 提交 之时,会将Row3的也提交


解决方案:

在catch中DeleteOnSubmit(Row3)






rtx.GetTable(tp).DeleteOnSubmit(obj);
//部分代码

 autoworkDataContext rtx = new autoworkDataContext(Properties.Settings.Default.autoworkConnectionString);
            
            Assembly assam = Assembly.Load("Autowork");
            Type tp= assam.GetType(fname);
          
            MethodInfo[] methods = tp.GetMethods();//获取方法
            int colnr = dst.Columns.Count;
            
            int rownr = dst.Rows.Count;
            string[] colnames = new string[100];
          


                for (int ii = 0; ii <= rownr - 1; ii++)
                {
                Object obj = new object();
                obj = Activator.CreateInstance(tp);
                for (int jj = 0; jj <= colnr - 1; jj++)
                    {
                       
                            colnames[jj] = dst.Columns[jj].ColumnName;
                          
                            string set_method = "set_" + colnames[jj];
                    //    MessageBox.Show(Convert.ToString(colnames[jj]));

                            MethodInfo method = tp.GetMethod(set_method);//获取方法
                            /*
                            Type pp= dst.Rows[ii][jj].GetType();
                            MessageBox.Show(Convert.ToString(pp));
                            */
                    // MessageBox.Show(Convert.ToString(method.Name));
                   Type checktype = dst.Rows[ii][jj].GetType();
                   // MessageBox.Show(Convert.ToString(checktype.Name));
                    
                    if (Convert.ToString(checktype.Name) == "Double")
                    {
                        
                        Object[] array = { Convert.ToInt32(dst.Rows[ii][jj]) };
                        method.Invoke(obj, array);
                    }
                    else
                    {
                        Object[] array = { dst.Rows[ii][jj] };
                        method.Invoke(obj, array);
                    }
                    // MessageBox.Show(Convert.ToString(dst.Rows[ii][jj]));
                      
                    }
                try
                {
                    
                    rtx.GetTable(tp).InsertOnSubmit(obj);
                    
                    rtx.SubmitChanges();
                }
                catch (Exception ex)
                {
                    rtx.GetTable(tp).DeleteOnSubmit(obj);
                    string exrow = string.Empty;
                    for (int jj = 0; jj <= colnr - 1; jj++)
                    {
                        exrow = exrow + " " + dst.Rows[ii][jj].ToString();
                    }
                    textBox.AppendText("\n" + exrow + " 行\n" + ex.Message + "\n");
                    // MessageBox.Show(exrow+" 行\n"+ex.Message);
                    WriteLog(ex);
                }


            }






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值