[C++Builder] ADO + Transaktionen starten?



  • Hallo zusammen,

    ich möchte gerne in meinem Projekt verschiedene ADO-Komponenten benutzen. Die ADOConnection-Komponente besitz mehrere Methoden für Transaktionen zu starten zu commiten usw.

    Kann mir jemand vielleicht mal ein Bsp-Code zeigen, wie man eine Transaction startet, und wenn alles klar gegangen ist diese commited oder wenn nicht einen Rollback durchführen!?

    Vielen Dank!

    Gruß



  • if (ADOConnection1->Connected==true) {
        int i = ADOConnection1->BeginTrans();
    
        if (ADOConnection1->InTransaction) {
        ....
           if () 
              ADOConnection1->CommitTrans();
           else 
              ADOConnection1->RollbackTrans();
    
       }
    }
    

    War das die Frage? Das habe ich gerade aus der BCB-Hilfe herausgelesen.



  • Von Prinzip her ist das die Lösung die ich gerne hätte, dafür schon mal danke!

    Doch ich frage mich jetzt nur noch, wo ich meine Operationen die zu einer Transaktion gehören jetzt reinbringe?!
    Wenn ich aufrufe ADOConnection->BeginTransaktion kann ich dann die Operationen so reinbringen?:

    ADOConnection->BeginTransaktion()
    {
       Operation1;
       Operation2;
       Methodenaufruf1;
       Operation3;
       Methodenauftruf2;
    
       usw.
    
    }
    

    Alle diese Operationen sollen zu einer Transaktion gehören! Und wenn bei einer dieser Operationen ein Fehler (z.B. die Verbindung zur DB wird getrennt) auftritt, dann soll ein Rollback durchgeführt werden! Ansonsten wird diese Transaktion mit Commit bestätigt.

    Hast du/ihr eine Lösung?

    Danke nochmal

    Gruß



  • Alles was Du über diese Verbindung machst, gehört nach Öffnen der Transaktion zu dieser Transaktion.

    Wenn Du also ein z.B. ADOQuery benutzt, dem diese Verbindung zuweist/zugewiesen hast und damit z.B. ein Insert ausführst, ist das innerhalb der Transaktion.

    Bsp. 1

    if (ADOConnection1->Connected==true) // Ist Verbindung hergestellt?
    {
       int i = ADOConnection1->BeginTrans();  
       if (ADOConnection1->InTransaction)   // Ist Transaktion erfolgreich gestartet?
       {
    
          if (ADOQuery1->Active)
             ADOQuery1->Close();
          ADOQuery1->Connection=ADOConnection1;
    
          ADOQuery1->SQL->Clear();
          ADOQuery1->SQL->Add("insert into Table (Columns) values (Blabla)");
          int nReturn = ADOQuery1->ExecSQL();
    
          if (nReturn>0)
             ADOConnection1->CommitTrans();
          else
             ADOConnection1->RollbackTrans();
       }
    }
    

    Genauso gut kannst Du die Vorbeitung Deiner Aktion auch außerhalb der Transaktion durchführen und nur die Ausführung selbst in der Transaktion.

    Bsp. 12

    if (ADOQuery1->Active)
        ADOQuery1->Close();
    
    ADOQuery1->Connection=ADOConnection1;
    
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("insert into Table (Columns) values (Blabla)");
    
    if (ADOConnection1->Connected==true) // Ist Verbindung hergestellt?
    {
       int i = ADOConnection1->BeginTrans();  
       if (ADOConnection1->InTransaction)   // Ist Transaktion erfolgreich gestartet?
       {
         int nReturn=0; 
    
         if (ADOQuery1->Active=false)
             nReturn = ADOQuery1->ExecSQL();
    
          if (nReturn>0)
             ADOConnection1->CommitTrans();
          else
             ADOConnection1->RollbackTrans();
       }
    }
    

    Neben ADOQuery geht natürlich auch ADOCommand etc.


Anmelden zum Antworten