Seite 1 von 1

SQLExpress und Transaktionen

Verfasst: Fr, 29. Nov 2013 10:42
von satmax
Ich habe versucht Daten innerhalb einer Transaktion zu speichern, in etwa so:

Code: Alles auswählen

oCur:BeginTransaction()
oCur:append()

aeval(aData,{|j,i| oCur:fieldPut(i,j) }, 1+nSkip)   // put data in new record (gather)

IF ! oCur:UpdateRow()
   tdMsg("Problem beim Speichern. (1230)"  )
ENDIF
oCur:EndTransaction()
Die Daten werden korrekt gespeichert aber anschließend ist kein Zugriff auf den Cursor (oCur) möglich, Gibt immer nur NIL zurück. Auch eine oCur:Refresh() geht nicht mehr.

Übersehe ich da etwas?

Gruß
Markus

Re: SQLExpress und Tansaktionen

Verfasst: Fr, 29. Nov 2013 11:03
von georg
Hallo, Markus -


hast Du mal daran gedacht, die Rückgabewerte der Methoden zu speichern und anzusehen? Eventuell gibt es ja eine Rückmeldung vom Server, die Dir hilft, das Problem zu verstehen.

Re: SQLExpress und Tansaktionen

Verfasst: Fr, 29. Nov 2013 11:08
von satmax
Ja, habe ich gemacht, da ist kein Problem zu erkennen.

Es geht alles solange keine Transaktion beendet wird. Beende ich die Transaktion ist der Cursor futsch, aber nicht nur der, sondern alle in diesem Thread! So als wenn die Connection geschlossen wurde. Im oCursor object sind dann alle Arrays leer, keine Daten, keine Struktur,...


Gruß
Markus

Re: SQLExpress und Tansaktionen

Verfasst: Fr, 29. Nov 2013 11:36
von georg
Hallo, Markus -


bei genauerem Hinsehen ... würde ich etwa so etwas erwarten:

Code: Alles auswählen

BEGIN TRANSACTION
UPDATE ...
INSERT ...
UPDATE ...
COMMIT
END TRANSACTION
Mir fehlt das COMMIT bzw. das ROLLBACK in Deinem Beispiel. Hast Du das absichtlich weggelassen?

Re: SQLExpress und Tansaktionen

Verfasst: Fr, 29. Nov 2013 11:46
von georg
Hallo, Markus -


also, ich habe mal im Quellcode nachgesehen: EndTransaction() wird wie ein Commit() ausgeführt, daher kann bei erfolgreicher Änderung der Commit() entfallen. Es ist aber nicht erkennbar, dass im Nachgang zum EndTransaction() irgendetwas am Cursor gemacht wird.

Sofern keiner hier einen Hinweis hat, würde ich mal Boris anschreiben, Du wirst sicher schnell eine hilfreiche Antwort bekommen.

Re: SQLExpress und Tansaktionen

Verfasst: Fr, 29. Nov 2013 11:47
von satmax
Hallo Georg,


so habe ich es auch versucht:

Code: Alles auswählen

               BEGIN SEQUENCE
                  nAunr = getNextAunr()
                  IF ! tdSqlAppend(oDlg:oCursAuftrag,.f.,{"_ID", "_ID_Bearbeiter", "_ID_KUNDE"})  // in tdSqlWork1.prg

                     tdMSG("Auftrag: kann keinen Datensatz anlegen.")
                  ELSE
                  // ***** Speichern
                     oDlg:oCursAuftrag:FieldPut("AuftragNr", nAunr)
                     oDlg:oCursAuftrag:FieldPut("Datum", DateString(Date()))
                     oDlg:oCursAuftrag:FieldPut("_ID_Bearbeiter", IDUser)
                     oDlg:oCursAuftrag:FieldPut("_ID_Kunde", idKunde)
                     oDlg:oCursAuftrag:FieldPut("FirmenNr", 1)
                     oDlg:oCursAuftrag:FieldPut("_ErstelltVon",cUser)
                     oDlg:oCursAuftrag:FieldPut("_ErstelltDat",DateString(Date()))
** einige Zeilen gelöscht
                     oDlg:oCursAuftrag:FieldPut("_ID_ZahlZiel",NIL)

                     oDlg:oConnection:CommitTransaction()


                      oDlg:oCursAuftrag:UpdateRow()
                  ENDIF
                  oDlg:oConnection:EndTransaction()
               RECOVER
                  oDlg:oCursAuftrag:RollbackTransaction()
                  SQLErrorLog("ERROR: Create order failed, transaction rolled back")
               ENDSEQUENCE

Re: SQLExpress und Tansaktionen

Verfasst: Fr, 29. Nov 2013 11:49
von satmax
georg hat geschrieben:Hallo, Markus -

Sofern keiner hier einen Hinweis hat, würde ich mal Boris anschreiben, Du wirst sicher schnell eine hilfreiche Antwort bekommen.
Das habe ich schon mal versucht, aber nur eine Rückmeldung vom Server bekommen das meine Mail eine Spam ist....

Ich warte noch 1/2 Tage und versuche es dann nochmals.

Gruß
Markus