Autor Beitrag
Vegeto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 10.10.13 08:28 
Hallo,

nachdem ich hier schon sehr gute Hilfe bekomen habe:Transaktionen in C#.
Bin ich heute wieder an einem Problem angekommen :/ Denn wenn man eine Transaktion auf mehrere Connection benutzen will muss man mit Transactionscope arbeiten.
Ich habe einwenig im Internet nachgesehen und habe mein Code danach umgebaut, jetzt habe ich solch ein Codegerüst:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
using (TransactionScope tranScope = new TransactionScope())
            {
                //Variablen

                //Löschen der Tabelle (Connection A wird verwendet)

     -->        //Hinzufügen neuer Datensätze, arbeiten mit einem DataReader, falls neue Datensätze aus anderen Server hinzugefügt werden sollen (Connection B wird verwendet)
                //Hinzufügen neuer Datensätze, arbeiten mit einem DataReader, falls neue Datensätze aus anderen Server hinzugefügt werden sollen (Connection B wird verwendet)(andere Select als oben)

                //Die neu Hinzugefügten Datensätze aktualisieren(Connection A wird verwendet), auch hier arbeite ich mit einem DataReader, damit ich die einzelnen Datensätze hole und 
                //im Programm bearbeiten kann und mit einer neuen Connection und Command wieder hinzufügen kann.
                
                
                tranScope.Complete();
            }

In jeden verwende ich using-Blöcke und Try-Catch-Blöcke, sobald ein Fehler ausgelöst wird soll eine Messagebox aufspringen was der Fehler war. Ich habe mit Absicht einen Fehler beim hinzufügen eingebaut um zu sehen was passiert, natürlich gibt er mir ein Fehler auf und die ganzen Befehle(queries) werden nicht durchgeführt, doch nachdem abgefangenen Fehler kommt es zu einem weiteren Fehler:
Der Vorgang ist für den Status der Transaktion ungültig.

Und er verweist auf eine Zeile im ersten INSERT(pfeil) auf Connection.Open();

Ich weiß echt nicht mehr weiter ich hoffe ihr könnt mir helfen.

LG

DANKE schonmal für das Durchlesen

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 10.10.13 09:06 
Hallo,

wenn du willst, das der gesamte TransactionScope nicht mehr weiter abgearbeitet wird, dann mußt du dort auch noch einen try...catch herumbauen (und nach Anzeige der MessageBox in den eingebetteten try...catch-Blöcken die Exception mittels throw weiterwerfen).
Aber das hat dir doch Ralf Jansen schon im anderen Beitrag erklärt: SQL Query erst nach Abschluss durchführen

Für diesen Beitrag haben gedankt: Vegeto
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 10.10.13 09:20 
Hallo Th69,

das Problem ist denke ich damit verbunden, dass wenn ich um den DataReader und Command ein Try-Catch block habe und sobald das Programm in ein Fehler läuft zeigt er den Fehler an und arbeitet weiter und schon damit ist ja die Transaktion abgebrochen und durch wieder verbinden zeigt er mir den Fehler an.

Doch du hast recht ich mach es mal mit einem throw im Catch block.

DANKE für den Gedankenstoß.

lg

edit:
Ich habe jetzt um tranScope.Complete() ein try-catch gemacht trotzdem kommt es zum fehler.
ich habe in jeden catch block ein throw eingefügt und dennoch kommt es zum Fehler :( :( :(

immer beim nächsten connection.open(kommt der fehler).
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 10.10.13 09:49 
Du solltest den Code zeigen dann verstehen wir das vielleicht.

So kann ich nur vermuten das du das mit den catch Blöcken verbastelt hast. Es macht für micht keinen Sinn mehr als einen zu haben eben den um die gesamte Transaktion herum.
Und b.) verwechselst du vielleicht das Verhalten von Commit bei einer Transaktion mit dem Verhalten eines Complete bei einem TransactionScope. Ein Complete macht keinen Commit! Es markiert den Scope nur damit dieser wenn er disposed wird (also am Ende des using Blocks des TransactionScopes) einen Rollback oder einen Complete auf alle beteiligten Transaktionen macht.

Für diesen Beitrag haben gedankt: Vegeto
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 10.10.13 10:12 
Hallo Ralf Jansen,

der Code ist ziemlich Lang (ca 500 Zeilen), doch wenn Ihr das wollte Poste ich ihn?

Aber das was du unter b.) gesagt hast hört sich Interessant an.
Das heißt es kommt zu keinem commit?

Ich bin auf diesen Gebiet wirklicher anfänger :/

Aber ich frage mal anders:
Wie würdest du es lösen, wenn eine Tabelle in einer Datenbank zuerst Gelöscht werden soll dann sollen zwei Insert-Queries durchgearbeitet werden mit DataReader und noch einmel Command für das einfügen per Parameter, danach soll die neuen Datensätze Aktualisiert werden, hier wird auch mittel Reader die Datensätze in variablen gesteckt dann bearbeitet und mittels Command und Parametern geupdated.
Und es werden immer verschiedene Connection benutzt.
Ich denke hier muss ein TransactionScope benutzt werden, doch leider schaffe ich das nicht richtig. :'(

Bin irgendwie am verzweifeln :(

Lg

Danke trotzdem an euch beide :)


EDIT:
So habe jetzt wie du gesagt hast nur eine try-catch gemacht ins Try ein Complete() und ins Catch ein Dispose(). Jetzt passiert auch ein RollBack(oder besser gesagt nichts mit der Tabelle, wenn es zum Fehler kommt).

DANKE DANKE DANKE

Lg
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 10.10.13 10:43 
Zitat:
Und es werden immer verschiedene Connection benutzt.
Ich denke hier muss ein TransactionScope benutzt werden, doch leider schaffe ich das nicht richtig. :'(


Hier würde ich eingreifen und sagen deine Prämisse, verschiedene Connections zu benutzen, ist ein/das Problem.
Nimn eine Connection. Wenn du jetzt sagst "Aufgrund von einem bestimmten Anwendungsdesign muß das so sein" würde ich antworten "Da liegt dann ein schwerer Designfehler vor" ;)
Verschieden Connections (in einer Transaktion) sollten nur nötig sein wenn verschiedenen Datenbanken in einer Transaktion zusammengefasst werden sollen. Das ist eigentlich auch der einzige sinnvolle Einsatzzweck eines TransaktionScope. Wenn alles in einer DB passiert machst du es aus irgendeinem Grund zu kompliziert.

Für diesen Beitrag haben gedankt: Vegeto
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Fr 11.10.13 10:08 
Hallo Ralf Jansen,

Danke für deine Antwort :)
Ich denke auch das die mehreren Connections das problem ist.

Zu deinem letzten satz, im moment passiert alles auf einem Server doch zu einem späterem Zeitpunkt müssen die Daten aus einem anderem Server geholt werden, deswegen die verschiedenen Connection.

Dennoch danke ich dir Sehr :)

Lg