用for循环将数据循环插入和更新,使用事务进行操作,出错就回滚
现在的问题是:点击确定按钮进行循环操作的时候,出现事务回滚,提示不成功;但我设断点单步调试(代码一点没改)的时候,
每一步都可以执行,整个循环可以插入,没有报错回滚,提示操作成功,请问这是怎么回事?为什么我单步调试就可以成功,
但我不单步调试的时候就通不过呢????请大家给我看看 OracleTransaction ot = null;
OracleConnection oc = null;
try
{
oc = new OracleConnection(ConfigurationSettings.AppSettings["ConnStr"]);
if (oc.State == ConnectionState.Closed)
oc.Open(); ot = oc.BeginTransaction(); OracleCommand ocmd = new OracleCommand();
ocmd.Connection = oc;
ocmd.Transaction = ot;
for (int k=0; k < s.Length; k++)
{
string[] snum = s[k].Split('|');
versionno = Convert.ToString(Convert.ToInt64(index) + k);
string sql = "insert into form_" + num + " ( ";
for (int i = 0; i < (arry.Count - 1); i++)
{
//arry[i] = dt1.Rows[i]["fenname"];
sql += arry[i] + ",";
}
sql = sql + arry[arry.Count - 1] + ", VERSIONNO,COPYACTNO,PWORKNO,PINSTANCENO,PVERSIONNO,PCOPYACTNO) values('";
for (int i = 0; i < arry.Count - 1; i++)
{
sql = sql + a[i] + "','";
} sql = sql + a[arry.Count - 1] + "','" + versionno + "','" + copyactno + "','" + num + "','" + instanceno + "','" + index + "','" + copyactno + "')";
sql1 = "insert into run_step ( workno,instanceno,activeno,nextactno,USTAFFID,UTIME,NEXTSTAFFID,versionno ,copyno) values ( '" + num + "','" + instanceno + "','" + Convert.ToString(activenum + 1) + "','" + Convert.ToString(activenum + 2) + "','" + dStuffNo + "',sysdate,'" + snum[0] + "','" + versionno + "','" + copyactno + "')";
sql2 = "insert into underwork (workno,instanceno,nextactno,nextstaffid,DEADLINE,versionno ,copyno) values ( '" + num + "','" + instanceno + "', '" + Convert.ToString(activenum + 2) + "','" + snum[0] + "',to_date('" + requesttime + "','yyyy-mm-dd hh24:mi:ss'),'" + versionno + "','" + copyactno + "' )";
if (typeno== "7")
{
sql3 = "update form_" + num + " set accessoriesDir ='" + supload + "',rDeptMno='" + snum[0] + "' where VERSIONNO='"+versionno+"'and COPYACTNO='"+copyactno+"'and PWORKNO='"+num+"'and PINSTANCENO='"+instanceno+"'and PVERSIONNO='"+index+"' and PCOPYACTNO='"+copyactno+"' and workno='" + num + "' and instanceNo='" + instanceno + "'";
}
else if (typeno== "9")
{
sql3 = "update form_" + num + " set accessoriesDir ='" + supload + "',rDeptTno='" + snum[0] + "' where VERSIONNO='" + versionno + "'and COPYACTNO='" + copyactno + "'and PWORKNO='" + num + "'and PINSTANCENO='" + instanceno + "'and PVERSIONNO='" + index + "' and PCOPYACTNO='" + copyactno + "' and workno='" + num + "' and instanceNo='" + instanceno + "'"; }
ocmd.Parameters.Clear();
ocmd.CommandText = sql;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear(); ocmd.CommandText = sql1;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear(); ocmd.CommandText = sql2;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear(); ocmd.CommandText = sql3;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear();
}
#endregion
ot.Commit();
if (oc.State == ConnectionState.Open)
{
oc.Dispose(); }
return 1;
}
catch (Exception ex)
{
ot.Rollback();
if (oc.State == ConnectionState.Open)
{
oc.Dispose(); }
return 0;
}
现在的问题是:点击确定按钮进行循环操作的时候,出现事务回滚,提示不成功;但我设断点单步调试(代码一点没改)的时候,
每一步都可以执行,整个循环可以插入,没有报错回滚,提示操作成功,请问这是怎么回事?为什么我单步调试就可以成功,
但我不单步调试的时候就通不过呢????请大家给我看看 OracleTransaction ot = null;
OracleConnection oc = null;
try
{
oc = new OracleConnection(ConfigurationSettings.AppSettings["ConnStr"]);
if (oc.State == ConnectionState.Closed)
oc.Open(); ot = oc.BeginTransaction(); OracleCommand ocmd = new OracleCommand();
ocmd.Connection = oc;
ocmd.Transaction = ot;
for (int k=0; k < s.Length; k++)
{
string[] snum = s[k].Split('|');
versionno = Convert.ToString(Convert.ToInt64(index) + k);
string sql = "insert into form_" + num + " ( ";
for (int i = 0; i < (arry.Count - 1); i++)
{
//arry[i] = dt1.Rows[i]["fenname"];
sql += arry[i] + ",";
}
sql = sql + arry[arry.Count - 1] + ", VERSIONNO,COPYACTNO,PWORKNO,PINSTANCENO,PVERSIONNO,PCOPYACTNO) values('";
for (int i = 0; i < arry.Count - 1; i++)
{
sql = sql + a[i] + "','";
} sql = sql + a[arry.Count - 1] + "','" + versionno + "','" + copyactno + "','" + num + "','" + instanceno + "','" + index + "','" + copyactno + "')";
sql1 = "insert into run_step ( workno,instanceno,activeno,nextactno,USTAFFID,UTIME,NEXTSTAFFID,versionno ,copyno) values ( '" + num + "','" + instanceno + "','" + Convert.ToString(activenum + 1) + "','" + Convert.ToString(activenum + 2) + "','" + dStuffNo + "',sysdate,'" + snum[0] + "','" + versionno + "','" + copyactno + "')";
sql2 = "insert into underwork (workno,instanceno,nextactno,nextstaffid,DEADLINE,versionno ,copyno) values ( '" + num + "','" + instanceno + "', '" + Convert.ToString(activenum + 2) + "','" + snum[0] + "',to_date('" + requesttime + "','yyyy-mm-dd hh24:mi:ss'),'" + versionno + "','" + copyactno + "' )";
if (typeno== "7")
{
sql3 = "update form_" + num + " set accessoriesDir ='" + supload + "',rDeptMno='" + snum[0] + "' where VERSIONNO='"+versionno+"'and COPYACTNO='"+copyactno+"'and PWORKNO='"+num+"'and PINSTANCENO='"+instanceno+"'and PVERSIONNO='"+index+"' and PCOPYACTNO='"+copyactno+"' and workno='" + num + "' and instanceNo='" + instanceno + "'";
}
else if (typeno== "9")
{
sql3 = "update form_" + num + " set accessoriesDir ='" + supload + "',rDeptTno='" + snum[0] + "' where VERSIONNO='" + versionno + "'and COPYACTNO='" + copyactno + "'and PWORKNO='" + num + "'and PINSTANCENO='" + instanceno + "'and PVERSIONNO='" + index + "' and PCOPYACTNO='" + copyactno + "' and workno='" + num + "' and instanceNo='" + instanceno + "'"; }
ocmd.Parameters.Clear();
ocmd.CommandText = sql;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear(); ocmd.CommandText = sql1;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear(); ocmd.CommandText = sql2;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear(); ocmd.CommandText = sql3;
ocmd.ExecuteNonQuery();
ocmd.Parameters.Clear();
}
#endregion
ot.Commit();
if (oc.State == ConnectionState.Open)
{
oc.Dispose(); }
return 1;
}
catch (Exception ex)
{
ot.Rollback();
if (oc.State == ConnectionState.Open)
{
oc.Dispose(); }
return 0;
}
解决方案 »
- C# 线程问题
- 请问“当前目录”和“基目录”分别是什么意思?
- c# 调用C++ API
- CodeSmith连接Oracle后,能访问表,但不能访问视图,请问如何解决?
- 报DataReader未关闭错误,请问如何解决?
- 【有难度,期待高手解答】如何用C#实现将字符串"(3 > 2) && (1 < 2 || 1 > 3)"的逻辑判断结果为true or false。
- 哪位高手 System.Data.OracleClient 下 OracleConnection 的 Provider
- 无法将文件“XXX.dll”复制到运行目录。进程无法访问文件,因为另一个程序正在使用此文件。
- 高分求vs.net正式版(english)的下载网址
- C#使用OLE操作DBF文件,插入datetime类型的值,在获取的时候只剩日期部分,时间部分变成了0
- vs2005用哪种exception捕获参数异常
- 关于在pictureBox里显示form的问题
报异常是:[System.Data.OracleClient.OracleException] = {"ORA-00001: unique constraint (WORKFLOW.SYS_C005495) violated\n"}
但我设断点单步调试的话它就不报异常,可以成功操作,
我插入每条记录后再把相应的记录更新,但并没有Commit提交,而是把这些插入和更新一起来提交,
是不是这样就报异常啊?
OracleConnection oc = null;
try
{
oc = new OracleConnection(ConfigurationSettings.AppSettings["ConnStr"]);
if (oc.State == ConnectionState.Closed)
oc.Open(); ot = oc.BeginTransaction(); OracleCommand ocmd = new OracleCommand();
ocmd.Connection = oc;
ocmd.Transaction = ot;
//你的代码
ot.Commit();
return 1;
}
catch (Exception ex)
{
//多加一个try...catch,有异常未必一定是事务的事情
try
{
ot.Rollback();
}
catch (Exception exx)
{
}
return 0;
}
finally
{
if (oc.State == ConnectionState.Open)
{
oc.Close();
}
}