2 screen333 Screen333 于 2014.03.08 22:17 提问

c#.net 调用oracle存储过程,不能正常回滚

本人是个小菜,刚接触.net不久,使用事务不熟练,导致回滚失败。下面是代码:

enter code here
  using (OracleConnection conn = new OracleConnection(strConn))
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }

            OracleCommand cmd = conn.CreateCommand();

            OracleTransaction ot = conn.BeginTransaction(IsolationLevel.ReadCommitted);
            cmd.Connection = conn;
            cmd.Transaction = ot;
            //cmd.Transaction = ot;
            //OracleTransaction ot = conn.BeginTransaction();

            try
            {
                foreach (XmlNode node in itemNodes)
                {
                    rcptGroupId = Convert.ToString(node.SelectSingleNode("RcptGroupID").InnerText);
                    amt = node.SelectSingleNode("Price").InnerText;

                    OracleParameter[] pm = new OracleParameter[14];

                    pm[0] = new OracleParameter("cardno", OracleType.VarChar, 20);
                    pm[0].Direction = ParameterDirection.Input;
                    pm[0].Value = cardNo;

                    pm[1] = new OracleParameter("rcptgroupid", OracleType.VarChar, 100);
                    pm[1].Direction = ParameterDirection.Input;
                    pm[1].Value = rcptGroupId;

                    pm[2] = new OracleParameter("amt", OracleType.Number);
                    pm[2].Direction = ParameterDirection.Input;
                    pm[2].Value = float.Parse(amt);

                    pm[3] = new OracleParameter("secrityno", OracleType.VarChar, 32);
                    pm[3].Direction = ParameterDirection.Input;
                    pm[3].Value = secrityNo;

                    pm[4] = new OracleParameter("cardserno", OracleType.VarChar, 32);
                    pm[4].Direction = ParameterDirection.Input;
                    pm[4].Value = cardSerNo;

                    pm[5] = new OracleParameter("userid", OracleType.VarChar, 4);
                    pm[5].Direction = ParameterDirection.Input;
                    pm[5].Value = userID;

                    pm[6] = new OracleParameter("rcptno", OracleType.VarChar, 20);
                    pm[6].Direction = ParameterDirection.Output;

                    pm[7] = new OracleParameter("resultcode", OracleType.Int16);
                    pm[7].Direction = ParameterDirection.Output;

                    pm[8] = new OracleParameter("errormsg", OracleType.VarChar, 200);
                    pm[8].Direction = ParameterDirection.Output;

                    //add 2013.8.1
                    pm[9] = new OracleParameter("Bank", OracleType.VarChar, 20);
                    pm[9].Direction = ParameterDirection.Input;
                    pm[9].Value = bank;

                    pm[10] = new OracleParameter("BankNo", OracleType.VarChar, 20);
                    pm[10].Direction = ParameterDirection.Input;
                    pm[10].Value = bankno;

                    pm[11] = new OracleParameter("TransMoney", OracleType.VarChar, 10);
                    pm[11].Direction = ParameterDirection.Input;
                    pm[11].Value = decimal.Parse(TransMoney);

                    pm[12] = new OracleParameter("CashTraceNo", OracleType.VarChar, 30);
                    pm[12].Direction = ParameterDirection.Input;
                    pm[12].Value = CashTraceNo;

                    pm[13] = new OracleParameter("TerminalId", OracleType.VarChar, 16);
                    pm[13].Direction = ParameterDirection.Input;
                    pm[13].Value = TerminalId;

                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "pkg_autobillservice.proc_autoopbillcharge2";
                    cmd.Parameters.AddRange(pm);
                    cmd.ExecuteNonQuery();

                    rcptNoList.Add(Convert.ToString(pm[6].Value));
                }
                ot.Commit();

            }
            catch (Exception ex)
            {
                ot.Rollback();
                return string.Format(result, "1", ex.Message, "", rcptGroupId);
            }
            finally
            {
                cmd.Dispose();
                ot.Dispose();

            }
        }

调用存储过程,第一次错误了能回滚,再执行一次到cmd.ExecuteNonQuery()数据就已经提交了。
这样写在循环第二次的时候还会报错,错误为:System.Data.OracleClient.OracleExceptionMessage=ORA-06550: 第 1 行, 第 7 列: PLS-00703: 列表中具有指定参数的多个实例。
一天了还是没有法解决,求大家帮忙看下。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
oracle中存储过程如何控制提交和回滚.
create table test1(id number,name varchar2(20)); create table test2(id number,name varchar2(20)); create table test3(id number,name varchar2(20)); 1. t1中没有显示commit; create or replace procedure t1
Oracle存储过程的commit和rollback,sqlerrm
最近ld说要把之前写得好好的一套存储过程说改成java,什么意思听起来不对劲呀。意思是不要用proc了,改成mybatis的sql,达到屏蔽差异性的效果。。。哈哈不是这么回事啊,首先proc里肯定用到了很多db的内置函数,这个不同的db都不一样的。比如oracle中的wm_concat,mysql中的group_concat,msserver的wmsys.wm_concat。另外自定义的函数是定义
oracle存储过程中的异常处理
1.问题来源 Oracle中可以用dbms_output.put_line来打印提示信息,但是很容易缓冲区就溢出了。 可以用DBMS_OUTPUT.ENABLE(1000000);来设置缓冲区的大小。 但是有大小,就有可能再溢出(程序写得太烂,错误不断,不好意思)。 于是想把异常信息写到一个表中。 2.建表 这个容易 create table wErrorLog (   proc
ORACLE存储过程调用存储过程时commit的问题
proc1 begin begin [sql1...] call proc2; ----调用其他的存储过程 exception when others then [sql2...] rollback; end; [sql3..] commit; end; 如代码中所写,在存储过程proc1中调用存储过
oracle 事务 回滚 存储过程
oracle 事务 回滚 存储过程 自用
java调用oracle存储过程
JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程
SSM+Oracle 存储过程例子
该项目是本人自学SSM和oracle存储过程的一个demo案例,感觉适合和我一样的初学者学习。
ava调用oracle存储过程结
ava调用oracle存储过程ava调用oracle存储过程ava调用oracle存储过程
Oracle - 存储过程异常处理事务分析
Oracle存储过程中的事务是如何处理的?通常情况下。整个过程是作为一个事务整体被提交或回滚的,这属于数据库的基本知识,这里简单说明:   1通常情况通常情况下,oralce将整个存储过程作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。 如下例所示: 例1 SQL*Plus: Release 11.2.0.1.0 Production on 星期三 1月 4 13:24:22
java调用oracle存储过程.wps
java调用oracle存储过程.wps java调用oracle存储过程.wps java调用oracle存储过程.wps