Announcement

Collapse
No announcement yet.

Transaktionsüberwachung mit Paradox-Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Transaktionsüberwachung mit Paradox-Tabellen

    Hi

    Ich möchte in meinem Programm eine Transaktionsüberwachung. Das heisst beim löschen von mehreren Datensätzen werden entweder alle gelöscht oder wenn ein Fehler auftritt wird wieder der alte zustand hergestellt.
    Ich habe das folgendermassen gelöst:

    tNote->Database->TransIsolation=tiDirtyRead;<br>
    tNote->Database->StartTransaction();<br>
    try<br>
    {<br>
    qSQLDelete->Close();<br>
    qSQLDelete->SQL->Clear();<br>
    qSQLDelete->SQL->Add("DELETE FROM Note WHERE(StudentID=26)");<br>
    qSQLDelete->ExecSQL();<br><br>

    tNote->Database->Commit();<br>
    }<br>
    catch(EDBEngineError& e)<br>
    {<br>
    tNote->Database->Rollback();<br>
    }<br>

    Das Problem ist wenn ein Fehler beim Löschen auftritt, wird der Rollback() gestartet, der aber mit folgender Fehlermeldung abbricht:
    Fehler<br>
    Im Projekt Zeugnismanager.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung: 'Für das Feld ist ein Wert erforderlich.<br>
    Feld<br>
    Feld: ìììììììììììì`. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.<br>

    Weis jemand was ich falsch mache?
    Für Hilfe bin ich euch im voraus sehr dankbar.

    Mfg
    Marco Vergari

  • #2
    Hallo,

    leider unterstützen Paradox-Tabellen keine echte Transaktionen, so dass die BDE diese Funktion über temp. Hilfstabellen simulieren muss. Beim Löschen wird eine Kopie des jeweiligen Datensatzes in dieser erst zur Laufzeit erstellten Hilfstabelle abgelegt. Soll nun ein Rollback durchgeführt werden, versucht die BDE, alle die in der temp. Hilfstabelle vorgefundenen Datensätze wieder in die originale Tabelle einzufügen. Wenn das nicht funktioniert, sollte man sich zuerst die Tabellenstruktur (Datentypen) sowie eventuell zugewiesenen Eingabeprüfungen, Vorbelegungen oder Beziehungen der referenziellen Integrität anschauen. Ich würde daher den Versuch zuerst mit einer ganz einfachen Tabellenstruktur wiederholen und mich im Erfolgsfall dann schrittweise zu komplexeren Strukturen vorarbeiten

    Comment


    • #3
      Hallo

      Danke für den Typ mit der Tabellenstruktur. Ich weis jetzt was den Fehler auslöst.
      Ich habe eine Tabelle mit drei Spalten (ID, StudentID, SubjectID)
      ID ist ein Zähler der automatisch immer um eins erhöht wird. (Datentyp +)
      StudentID und SubjectID sind beides Integer und die Eigenschaft "Eingabe erforderlich" ist aktiviert.
      Ich habe die Eigenschaft "Eingabe erforderlich" deaktiviert und das Rollback hat funktioniert. Allerdings wurden nur die Datensätze wieder hergestellt mit dem ID-Wert, nicht aber die Werte der StudentID und SubjectID.
      Was muss ich machen, dass alle Werte wieder hergestellt werden? Geht das mit Paradox überhaupt?

      Gruss
      Marco Vergar

      Comment


      • #4
        Hallo,

        immer dann, wenn ich mit Spaltenbezeichnung zu tun bekomme, die auf "ID" enden, denke ich an die referenzielle Integrität. Sind eventuell diese Tabellen miteinander über Referenzintegritäts-Regeln verknüpft? Außerdem hat man bei AUTOINC-Spalten immer das Problem, dass die BDE <b>niemals</b> den "echten" Datensatz zurückschreiben kann, da der Wert für die AUTOINC-Spalte in jedem Fall neu gesetzt wird. Somit versucht die BDE zwei Schritte: <br>
        1. Neuen Datensatz anlegen <br>
        2. Wert für StudentID und SubjectID zurückspielen (UPDATE Tabelle SET StudentID = :OldStudentID, SubjectID = :OldSubjectID WHERE ID = :OldID). Leider gibt es keinen Datensatz mehr, der zu :OldID passt, da beim Anlegen eines neuen Datensatzes im Schritt 1 ein neuer AUTOINC-Wert zugewiesen wurde :-(

        Um diese Theorie zu verifizieren, würde ich den Test mit einer Tabelle wiederholen, die <b>kein</b> AUTOINC-Feld verwendet

        Comment


        • #5
          Hallo

          Ich habe die AUTOINC Funktion abgeschalten, doch es funktioniert auch nicht. Es erscheint zwar keine Fehlermeldung beim Rollback, aber die Felder StudentID und SubjectID bleiben leer.<br>
          Wenn ich die AUTOINC Funktion einschalte, passiert das gleiche. Die alten ID Werte stellt die BDE auch wieder her.<br>
          Die Tabellen sind nicht über Referenzintegritäts-Regeln miteinander verknüpft. Was ist das überhaupt?

          Gruss<br>
          Marc

          Comment

          Working...
          X