Frage

Ich brauche ein Werkzeug für die Durchführung komplexer Skripte für eine Datenbank erstellen.

Für mehrere welche resasons kann ich nicht auf DB Transaktionsverhalten verlassen, aber ich brauche, um mein eigenes Transaktionssystem zu implementieren.

Der Ansatz, den ich versuche, mich mit Hilfe des Befehlsmuster ist (mein Fall ist komplizierter, hier habe ich eine vereinfachte Version für die Diskussion):

type
  IMyCommand = interface(IInterface)
    procedure Execute();
    procedure Undo();
  end;

type
  TSQLCommand = class (TInterfacedObject, IMyCommand)
  private
    FDBConnection: TDBConnection;
    FDBQuery: TDBQuery;
    FExecuteSQL: string;
    FUndoSQL: string;
    FExecuted: boolean; // set to True as the command has been executed
  public
    procedure Execute;
    procedure Undo;
    procedure Prepare(aExecuteSQL, aUndoSQL: string);
    constructor Create(aDBConnection: TDBConnection);
    destructor Destroy; override;
  end;

erstelle ich eine Reihe von Aktionen, für jede Aktion, die ich ein „Execute“ und „Rückgängig“ SQL-Anweisung, Beispiele passieren:

Ein Aufruf könnte zur Vorbereitung sein:

Prepare('INSERT INTO TESTTABLE (ID, DATA) VALUES (15, 'Hello')',// aExecuteSQL
'DELETE FROM TESTTABLE WHERE ID = 15'); //aUndoSQL

so irgendwie mache ich sehr kleine Änderungen (wie eine einzige einfache Zeile einzufügen, um eine einzelne Zeile zu aktualisieren, ...), für jede Änderung der „Undo“ ist sehr offensichtlich.

werde ich einen Stapel von Befehlsobjekten herzustellen (mit wahrscheinlich der TObjectStack Sammlung), und rufen Sie den Befehl Methode eines nach dem anderen ausführen und als ein ausgeführt werde ich FExecuted auf True, und speichern Sie die Komponente auf der Platte gesetzt.

Also, was ich zu tun whant zu ist es, alle die Skripte ausgeführt werden, aber ich will die Fälle verwalten, in denen etwas schief geht.

Wenn etwas schief geht Ich möchte alle die Befehle von den letzten auszuführen, um zuerst die Undo-Methode aufrufen. Natürlich, bevor Sie das ich brauche, tun zu können, von der Festplatte wiederherstellen, die Komponenten (falls der Ausfall ein Hardware-Fehler, falls der Ausfall ein weiterer Grund, ich habe bereits den Stapel im Speicher und kann auf eine Undo ein Befehl einfach anrufen Zeit).

Hinweis: Der Hauptgrund, warum ich nicht auf dem DB-Transaktionsverhalten verlassen kann ist, dass ich auch große Blobs einfügen muß, und jeder Blob aus dem Internet heruntergeladen und dann eingefügt, so dass ich nicht eine Transaktion offen für immer verlassen kann, weil ich will jede noch so kleine Änderung an der db zu begehen. Was ich mit Blobs ist ein Download, einfügen es, download nächsten, einfügen es, ...

Also meine Frage ist: könnte vorschlagen, dass Sie einen Weg auf die Festplatte beharren meine Objekte? Ich habe Delphi 2009, so eine Möglichkeit ist, ein TInterdacedPersistent zu machen und speichern Sie die Komponente zu streamen und dann auf Datei, sowieso auf diese Weise ich viele Dateien haben würde, mit extra complicatinos, während ich eine einzelne Datei bevorzugen. Könnten Sie vorschlagen?

Edit:. Ich erkennen TObjectStack ist Buggy in Delphi 2009 (Pop gibt keinen richtigen Typen), so kann das gleiche mit TObjectStack erfolgen

War es hilfreich?

Lösung

Ich kann nicht einen besseren Ansatz sehen, als eine Transaktion mit, wie Andrei K. erwähnte Ihre Implementierung ist nicht sicher, deshalb mit Starttransaction, Commit und Rollback ist ein MUSS!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top