Oracle数据使用事务异常—Command 的 Transaction 属性尚未初始化异常

来源:互联网 发布:淘宝怎么看产品的排名 编辑:程序博客网 时间:2024/05/16 11:30

如果提示以下信息“System.InvalidOperationException: 如果分配给 Command 的 Connection 对象位于挂起的本地事务中,Execute 将需要 Command 对象具有 Transaction 对象。Command 的 Transaction 属性尚未初始化。” 基本情况是有同时使用 OracleConnection 和 OracleCommand 引起的。

原因:在于在 OracleConnection 中声明了事务,但是 OracleCommand  使用 OracleConnection 时没有重新做 事务声明引起的。

解决方法:使用  OracleConnection 时借用 OracleConnection的事务声明即可。

           using (OracleConnection oraConn = new OracleConnection(cdt.DBOperators[0].ConnectString))            {                oraConn.Open();                OracleTransaction transaction=oraConn.BeginTransaction();                try                {                    foreach (DataTable dt in dts)                    {                        if (dt.TableName.Equals(dataOut))                        {                            //删除相关表的数据                            this.DisposeDeleteData(dt, oraConn, transaction);                        }                        else                        {                            //需要更新的数据                            this.UpdateDataTable(dt, oraConn, transaction);                        }                    }                    transaction.Commit();                    return true;                }                catch(Exception ex)                {                    transaction.Rollback();                    throw ex;                }            }

  /// <summary>        /// 读取Dataout零时表数据,删除已经被删除的旧文件        /// </summary>        /// <param name="dt"></param>        /// <param name="oraConn"></param>        private void DisposeDeleteData(DataTable dt, OracleConnection oraConn, OracleTransaction transaction)        {            string tableName = string.Empty;            string tableKeys = string.Empty;            foreach (DataRow dr in dt.Rows)            {                if (!tableName.Equals(dt.TableName))                {                    tableName = dt.TableName;                    OracleCommand getKeysCmd = new OracleCommand(fGetTableKeys, oraConn);                    //在此处添加事务处理声明                    getKeysCmd.Transaction = transaction;                    getKeysCmd.CommandType = CommandType.StoredProcedure;                    getKeysCmd.Parameters.Add(new OracleParameter("varAlias", tableName));                    getKeysCmd.Parameters.Add(new OracleParameter("varTableName", tableName));                    OracleParameter outPa = new OracleParameter("varKeys", OracleType.VarChar, 120);                    outPa.Direction = ParameterDirection.ReturnValue;                    getKeysCmd.Parameters.Add(outPa);                    getKeysCmd.ExecuteNonQuery();                    tableKeys = outPa.Value.ToString();                }                OracleCommand cmd = new OracleCommand(string.Format("delete from {0} where {1}='{2}'",                    tableName, tableKeys, dr["PrimKey"].ToString()), oraConn);                cmd.ExecuteNonQuery();            }        }




原创粉丝点击