Oracle數據使用事務異常—Command 的 Transaction 屬性尚未初始化異常

如果提示以下信息“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();
            }
        }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章