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

解决方案 »

  1.   

    我是想插入数据后再把它更新,一起作为事务来出来
    报异常是:[System.Data.OracleClient.OracleException] = {"ORA-00001: unique constraint (WORKFLOW.SYS_C005495) violated\n"}
      

  2.   

    如果for循环里只是一条记录就没有问题,但如果有多条后就提示异常,
    但我设断点单步调试的话它就不报异常,可以成功操作,
    我插入每条记录后再把相应的记录更新,但并没有Commit提交,而是把这些插入和更新一起来提交,
    是不是这样就报异常啊?
      

  3.   

    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;
        
        //你的代码
        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();
        }
    }
      

  4.   

    而且你的程序报的貌似是违反了唯一约束,在catch块看看详细出错信息