我收到错误 System.InvalidOperationException:"给定对象的当前状态,操作无效。



当代码正在工作并且到达执行提交的部分时,错误就会出现在

我在appsettings部分看到了必须修改Webconfig的解决方案,但是,没有其他解决方案不需要修改Webconfig吗?

这是错误出现的代码,正是在Commit 中

public ErrorCode insertNC(EntidadesNC data)
{
var errorCode = new ErrorCode();
DbConnection DataConnection = ConnectionGet(enuTypeDataBase.OracleVTime);
DbTransaction tran = null;
try
{
DataConnection.Open();
tran = DataConnection.BeginTransaction();
foreach (var item in data.ListainsertNC)
{
if (errorCode.P_COD_ERR == 0)
{
errorCode = insertNCV2(item, DataConnection, tran);
}
}
}
catch (Exception ex)
{
errorCode.P_COD_ERR = 1;
errorCode.P_MESSAGE = ex.ToString();
ELog.save(this, ex.ToString());
}
finally
{
if (errorCode.P_COD_ERR == 0)
{
tran.Commit();
}
else
{
tran.Rollback();
}
if (DataConnection.State == ConnectionState.Open) DataConnection.Close();
}
return errorCode;
}

这是函数insertNCV2被称为的代码

public ErrorCode insertNCV2(itemNC data, DbConnection connection, DbTransaction tran)
{
List<OracleParameter> parameter = new List<OracleParameter>();
var response = new itemNC();
var errorCode = new ErrorCode();
var sPackageName = ProcedureName.pkg_paymentNC + ".SP_PRUEBA_PAYROLL";
try
{
parameter.Add(new OracleParameter("P_NID_COTIZACION", OracleDbType.Int64, data.P_NID_COTIZACION, ParameterDirection.Input));
parameter.Add(new OracleParameter("P_NRECEIPT", OracleDbType.Varchar2, data.P_NRECEIPT, ParameterDirection.Input));
parameter.Add(new OracleParameter("P_SCODCHANNEL", OracleDbType.Int64, data.P_SCODCHANNEL, ParameterDirection.Input));
//OUTPUT
OracleParameter P_COD_ERR = new OracleParameter("P_COD_ERR", OracleDbType.Int32, 9000, errorCode.P_COD_ERR, ParameterDirection.Output);
OracleParameter P_MESSAGE = new OracleParameter("P_MESSAGE", OracleDbType.Varchar2, 900, errorCode.P_MESSAGE, ParameterDirection.Output);

parameter.Add(P_COD_ERR);
parameter.Add(P_MESSAGE);
OracleDataReader odr = (OracleDataReader)this.ExecuteByStoredProcedureVT(sPackageName, parameter);
// ELog.CloseConnection(odr);
}
catch (Exception ex)
{
errorCode.P_COD_ERR = 1;
errorCode.P_MESSAGE = "Hubo un error al insertar los sub items de las coberturas"; // ex.ToString();
ELog.save(this, ex.ToString());
}
return errorCode;
}

我感谢任何形式的帮助:(

带有数据库操作的

InvalidOperationException通常表示在执行代码行之前,连接已关闭或中止。

事务的另一种情况是,交易从未启动。有了Transactions,事情就简单了一点,我们不需要在异常上回滚事务,在DB操作期间引发的许多异常无论如何都会中止事务,在没有显式Commit的情况下关闭连接也会有效地回滚事务。

  • 使用回滚返回到事务检查点,而不是取消中止事务

移动提交逻辑可能有助于调试以下内容:

public ErrorCode insertNC(EntidadesNC data)
{
var errorCode = new ErrorCode();
DbConnection DataConnection = ConnectionGet(enuTypeDataBase.OracleVTime);
DbTransaction tran = null;
try
{
DataConnection.Open();
tran = DataConnection.BeginTransaction();
foreach (var item in data.ListainsertNC)
{
if (errorCode.P_COD_ERR == 0)
{
errorCode = insertNCV2(item, DataConnection, tran);
}
}
if (errorCode.P_COD_ERR == 0)
{
tran.Commit();
}
else
{
tran.Rollback();
}
}
catch (Exception ex)
{
errorCode.P_COD_ERR = 1;
errorCode.P_MESSAGE = ex.ToString();
ELog.save(this, ex.ToString());
}
finally
{
if (DataConnection.State == ConnectionState.Open) DataConnection.Close();
}
return errorCode;
}

最新更新