一旦出现某一行重复,
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);
}
}