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