Ich habe eine Routine, die eine rekursive Schleife verwendet, um Elemente in eine SQL Server 2005-Datenbank einzufügen Der erste Aufruf, der die Schleife initiiert, ist in einer Transaktion mit TransactionScope eingeschlossen. Beim ersten Aufruf von ProcessItem werden die myItem-Daten wie erwartet in die Datenbank eingefügt. Wenn jedoch ProcessItem von ProcessItemLinks oder ProcessItemComments aufgerufen wird, erhalte ich den folgenden Fehler.Warum ist der TransactionScope-Vorgang nicht gültig?
„Die Operation ist für den Zustand der Transaktion ungültig“
ich dies mit VS 2008 auf Windows 7 im Debug leite und haben laufen die MSDTC verteilte Transaktionen zu ermöglichen. Der folgende Code ist nicht mein Produktionscode, sondern ist genau gleich. Die AddItemToDatabase ist eine Methode für eine Klasse, die ich nicht ändern kann, und verwendet einen Standard ExecuteNonQuery(), der eine Verbindung erstellt, die dann geschlossen und nach Abschluss beendet wird.
Ich habe andere Postings hier und im Internet angeschaut und kann dieses Problem immer noch nicht lösen. Jede Hilfe würde sehr geschätzt werden.
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);
}
}
Hier ist der obere Teil des Stack-Trace. Leider kann ich den Aufbau bis zu diesem Zeitpunkt nicht als sensible Unternehmensinformationen darstellen, die ich nicht offen legen kann.
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()
Könnten Sie den Stack-Trace schreiben der Ausnahme? –
Ich habe so viel von der Spur hinzugefügt wie erlaubt. Hoffe es ist genug! – Cragly
Können Sie die gesamte Ausnahme posten? Veröffentlichen Sie die Ausgabe von ex.ToString() und redigieren Sie etwas Sensitives. Ich frage mich, ob es eine InnerException oder zwei gibt. –