Tengo una rutina que usa un ciclo recursivo para insertar elementos en una base de datos de SQL Server 2005 La primera llamada que inicia el ciclo se incluye dentro de una transacción usando TransactionScope. Cuando llamo por primera vez a ProcessItem, los datos myItem se insertan en la base de datos como se esperaba. Sin embargo, cuando se invoca ProcessItem desde ProcessItemLinks o ProcessItemComments, aparece el siguiente error.¿Por qué el funcionamiento de TransactionScope no es válido?
“La operación no es válida para el estado de la transacción”
estoy corriendo en esta depuración con VS 2008 en Windows 7 y tienen el MSDTC se ejecuta para permitir las transacciones distribuidas. El código a continuación no es mi código de producción, pero se establece exactamente igual. AddItemToDatabase es un método en una clase que no puedo modificar y utiliza un ExecuteNonQuery estándar() que crea una conexión y luego se cierra y desecha una vez que se completa.
He visto otras publicaciones aquí e Internet y todavía no puedo resolver este problema. Cualquier ayuda sería muy apreciada.
using (TransactionScope processItem = new TransactionScope())
{
foreach (Item myItem in itemsList)
{
ProcessItem(myItem);
}
processItem.Complete();
}
private void ProcessItem(Item myItem)
{
AddItemToDatabase(myItem);
ProcessItemLinks(myItem);
ProcessItemComments(myItem);
}
private void ProcessItemLinks(Item myItem)
{
foreach (Item link in myItem.Links)
{
ProcessItem(link);
}
}
private void ProcessItemComments(Item myItem)
{
foreach (Item comment in myItem.Comments)
{
ProcessItem(comment);
}
}
Aquí está la parte superior del seguimiento de la pila. Lamentablemente, no puedo mostrar la compilación hasta este momento como información confidencial de la empresa que no puedo revelar.
at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction)
at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
Podría publicar el seguimiento de la pila de la excepcion? –
He agregado la mayor cantidad de trazas permitidas. Espero que sea suficiente! – Cragly
¿Puedes publicar la excepción completa? Publique la salida de ex.ToString(), luego elimine cualquier cosa sensible. Me pregunto si hay una InnerException o dos. –