Jag har problem att få en Transaction att fungera. Så här ser det ut. Du måste se till att definiera din objekt utanför din create metod och tilldela de objekt du vill komma ät i sub klassen i tex din bas klass create metod. Tack så mycket för din utförliga beskrivning. Jag lyckades lösa det på liknande sätt.Transaction
Jag har en abstrakt superklass med en overridable Create-metod och en subklass med samma metod. I subklassens Create() så börjar den med att anropa superklassen genom MyBase.Create().
När den har körts lägger sedan subklassen in övriga uppgifter i databasen. Nu kommer problemet. Jag vill kunna knyta en Transaction till detta så om det blir fel i subklassen (som körs efteråt) så ska en Rollback köras och ångra det som gjordes i superklassens Create-metod.
Det är samma Connection-objekt som används i bägge klasserna. Däremot är det inte samma Command.
Superklass:
<code>
Public Overridable Function Create([...])
...
Try
oConnection.Open()
oTransaction = oConnection.BeginTransaction
oCommand.Transaction = oTransaction
oCommand.ExecuteNonQuery()
Catch ex As Exception
...
Finally
If Not oConnection.State = ConnectionState.Closed Then
oConnection.Close()
End If
End Try
End Function
</code>
I superklassen startar jag transaktionen i Try-blocket. Transaktionen vill jag ska följa med även i subklassen. Så blir inte fallet eftersom oCommand dör innan.
Subklass
<code>
Public Shadows Function Create
MyBase.Create([...])
...
Try
oConnection.Open()
oCommand.ExecuteNonQuery()
Catch ex As Exception
oTransaction.Rollback()
...
Finally
If Not oConnection.State = ConnectionState.Closed Then
oConnection.Close()
End If
End Try
End Function
</code>
Då får jag följande fel: "This SqlTransaction has completed; it is no longer usable."
Mycket tacksam för all hjälp jag kan få.Sv: Transaction
Om du tar en titt på din kod så ser du att i sub klassens create kör du bas klassens create metod. Bas klassen öppnar en connection, transaktoion startas och execute körs. Men du stänger även din connection, så när din sub klass sedan kommer till oConnection.Open() så finns den inte längre.
Se till så din bas klass create skapar upp en connection och transaction, se då till att de lagras i en variblar definierade utanför create. I din sub klass create metod kör du MyBase.Create()
sedan för att komma åt ditt connection object som öppnades i bas klassen skriver du:
MyBase.oConnection.Open()
om nu din variabel hetter oConnection.
Sedan för att köra execute skriver du
MyBase.oConnection.ExecuteNonQuery()
Se till att utföra din transaction och se till att stänga din connection i sub klassen när du är klar.
MyBase.oConnection.Close()
TIPS!! Att hålla igång en transaction kräver prestanda, så försök starta en så sent som möjligt och avsluta den så fort som möjligt, gäller även connection mot databas.
/Fredrik Normén NSQUARED2Sv: Transaction