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