本人用做.NET开发,访ORACLE 数据库,用到了MSDTS 和Oracle Services for Microsoft Transaction Server,出现如下错误:ORA-00161: 事务处理的分支长度 XX 非法 (允许的最大长度为 64)
环境:
数据库 :ORACLE 11 X64
服务器: Windows 7 X64 ,IIS 7,,Oracle Client 11 X64
客户端:Wndows7 X64被这个问题折腾得寝食难安,望高人指教,谢谢了!

解决方案 »

  1.   

    安装Oracle 11g 客户端即可。如果提示不支持Windows 7,强制安装即可!
      

  2.   


    ORA-00161 transaction branch length string is illegal (maximum allowed string)
              --字符串超限!Cause: An external transaction branch ID with a length either too large or 0 was passed in.Action: Report the problem to your external transaction coordinator vendor.
      

  3.   

    问题悬而未决,希望大家关注下,谢谢!现贴出出错代码
            /// <summary>
            /// 增加周计划列表
            /// </summary>
            /// <param name="operateUser">操作员</param>
            /// <param name="week_plan_list">周计划列表</param>

            public void AddWeekPlanList(USER operateUser, List<WEEK_PLAN> week_plan_list)
            {
                WEEK_PLAN_DBAccess week_plan_dbAccess = new WEEK_PLAN_DBAccess();
                SEQUENCE_PLANNING_DBAccess sequence_planning_dbAccess = new SEQUENCE_PLANNING_DBAccess();
                PROCEDURE_PLAN_CD_DBAccess procedure_plan_cd_dbaccess = new PROCEDURE_PLAN_CD_DBAccess();
                SPECIFY_DBAccess specify_dbAccess = new SPECIFY_DBAccess();
                PLAN_CHARACTER_DBAccess plan_character_dbAccess = new PLAN_CHARACTER_DBAccess();
                WORK_CHARACTER_DBAccess work_character_dbAccess = new WORK_CHARACTER_DBAccess();
                List<WEEK_PLAN_HISTORY> week_plan_history_list = new List<WEEK_PLAN_HISTORY>();            WEEK_PLAN week_plan = null;
                SPECIFY specify = null;
                USER_DBAccess user_dbAccess = new USER_DBAccess();
                if (operateUser == null || string.IsNullOrEmpty(operateUser.USER_ID))
                {
                    throw new FaultException<InvalidValueException>(new InvalidValueException("操作员对象或其ID为空!"));
                }            if (week_plan_list == null || week_plan_list.Count == 0)
                {
                    throw new FaultException<InvalidValueException>(new InvalidValueException("周计划列表不能为空!"));
                }
                try
                {
                    TransactionOptions option = new TransactionOptions();
                    option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
                    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, option))
                    {
                        if (user_dbAccess.Exists(operateUser.USER_ID) == false)

                        {
                            throw new FaultException<BusinessException>(new BusinessException(string.Format("操作员不是本部门员工!")));
                        }
                        for (int i = 0; i < week_plan_list.Count; i++)
                        {
                            week_plan = week_plan_list[i];
                            if (week_plan == null)
                            {
                                throw new FaultException<InvalidValueException>(new InvalidValueException("周计划列表不能存在为空的元素!"));
                            }
                            specify = specify_dbAccess.GetModel(week_plan.SPECIFY);
                            if (specify == null)
                            {
                                throw new FaultException<BusinessException>(new BusinessException(string.Format("周计划列表中第个元素对应的专业ID [{1}] 在数据库中不存在!", i, week_plan.SPECIFY)));
                            }
                            if (work_character_dbAccess.Exists(week_plan.WORK_CHARACTER) == false)
                            {
                                throw new FaultException<BusinessException>(new BusinessException(string.Format("周计划列表中第个元素对应的工作性质ID [{1}] 在数据库中不存在!", i, week_plan.WORK_CHARACTER)));
                            }
                            if (plan_character_dbAccess.Exists(week_plan.PLAN_CHARACTER) == false)
                            {
                                throw new FaultException<BusinessException>(new BusinessException(string.Format("周计划列表中第个元素对应的工作性质ID [{1}]在数据库中不存在!", i, week_plan.PLAN_CHARACTER)));
                            }
                            week_plan.WEEK_PLAN_ID = sequence_planning_dbAccess.GetNextVal();
                            week_plan.WEEK_PLAN_CD = procedure_plan_cd_dbaccess.GetWeekPlanCd(week_plan.SPECIFY);
                            week_plan.REGISTER_TIME = DateTime.Now;
                            week_plan.REGISTER_USER_ID = operateUser.USER_ID;
                            week_plan.UPDATE_TIME = week_plan.REGISTER_TIME;
                            week_plan.UPDATE_USER_ID = week_plan.REGISTER_USER_ID;
                            if ((week_plan.STATE == "4") || (this.GetPlanCharacter(week_plan.PLAN_CHARACTER).CHAR_CD == "A"))
                            {
                                WEEK_PLAN_HISTORY week_plan_history = new WEEK_PLAN_HISTORY();
                                week_plan_history.WEEK_PLAN_ID = week_plan.WEEK_PLAN_ID;
                                week_plan_history.REASON = week_plan.REASON;
                                week_plan_history_list.Add(week_plan_history);
                            }
                            week_plan_dbAccess.Add(week_plan);
                        }
                        if (week_plan_history_list.Count > 0)
                        {
                            this.AddWeekPlanHistoryList(operateUser, week_plan_history_list);
                        }
                        scope.Complete();
                    }
                }
                catch (DbException ex)
                {
                    throw new FaultException<DataAccessException>(new DataAccessException(ex.Message + "访问数据库时出现异常!"));
                }
                catch (FaultException ex)
                {
                    throw ex;
                }
                catch (Exception ex)
                {
                    throw new FaultException<ServiceException>(new ServiceException(ex.Message + "服务内发生异常!"));
                }        }
            /// <summary>
            /// 删除周计划列表
            /// </summary>
            /// <param name="operateUser">操作员</param>
            /// <param name="week_plan_list">周计划列表</param>
            public void DeleteWeekPlanList(USER operateUser, List<WEEK_PLAN> week_plan_list)
            {
                WEEK_PLAN_DBAccess week_plan_dbAccess = new WEEK_PLAN_DBAccess();
                WEEK_PLAN week_plan = null;
                USER_DBAccess user_dbAccess = new USER_DBAccess();
                if (operateUser == null || string.IsNullOrEmpty(operateUser.USER_ID))
                {
                    throw new FaultException<InvalidValueException>(new InvalidValueException("操作员对象或其ID为空!"));
                }            if (week_plan_list == null || week_plan_list.Count == 0)
                {
                    throw new FaultException<InvalidValueException>(new InvalidValueException("周计划列表不能为空!"));
                }
                try
                {
                    TransactionOptions option = new TransactionOptions();
                    option.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
                    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, option))
                    {
                        if (user_dbAccess.Exists(operateUser.USER_ID) == false)
                        {
                            throw new FaultException<BusinessException>(new BusinessException(string.Format("操作员不是本部门员工!")));
                        }
                        for (int i = 0; i < week_plan_list.Count; i++)
                        {
                            week_plan = week_plan_list[i];
                            if (week_plan == null)
                            {
                                throw new FaultException<InvalidValueException>(new InvalidValueException("周计划列表不能存在为空的元素!"));
                            }
                            if (week_plan_dbAccess.Exists(week_plan.WEEK_PLAN_ID) == false)
                            {
                                throw new FaultException<BusinessException>(new BusinessException(string.Format("周计划列表中ID为 [{0}] 元素数据库不存在!", week_plan.WEEK_PLAN_ID)));
                            }
                            (new WEEK_PLAN_HISTORY_DBAccess()).DeleteByWeekPlanID(week_plan.WEEK_PLAN_ID);
                            week_plan_dbAccess.Delete(week_plan.WEEK_PLAN_ID);
                        }
                        scope.Complete();
                    }
                }
                catch (DbException ex)
                {
                    throw new FaultException<DataAccessException>(new DataAccessException(ex.Message + "访问数据库时出现异常!"));
                }
                catch (FaultException ex)
                {
                    throw ex;
                }
                catch (Exception)
                {
                    throw new FaultException<ServiceException>(new ServiceException("服务内发生异常!"));
                }
            }
    出错部分已用红色标出,即进入分布式事务后执行的第一个数据库操作时抛出异常
      

  4.   

    安装 Oracle Data Access Components 11.1.0.7.10 Beta 解决问题了