Avatar billede kingpin Nybegynder
03. april 2001 - 10:21 Der er 1 kommentar og
1 løsning

Transaction i Interbase (Delphi)

Nedenstående er lavet ala MSSQL men hvordan laves det til INTERBASE 6.0

var s: string;

begin
  with query1 do
  begin
    close;
    sql.clear;
    s:= \'begin transaction\'+
        \' insert into person values(\'\'\' + edtNavn.Text + \'\'\',\'\'\' + edtAdresse.Text + \'\'\')\'; // Skriver til DB
    \' if ... // undersøger om det er gået godt
        \' commit transaction else rollback transaction\';
    sql.Add(s);
    ExecSQL;
  end;
end;

Problemet er hvad skal der helt præcis stå i stedet for \'begin transaction\' der starter en transaction?

Interbase hjælp:
Syntax SET TRANSACTION [NAME transaction]
hvordan når det skal kaldes fra delphi
Avatar billede pellelil Nybegynder
03. april 2001 - 11:23 #1
Jeg kommer selv fra en MS-SQL baggrund og havde svært ved at vende mig til at ALT i Interbase foregår i transactioner. I forbindelse med MS-SQL brugte jeg kun transaktioner når jeg \"synes\" at der var brug for det.

Når vi taler Interbase så vil jeg foreslå at du benytter IBX (InterBase Express). Når du gør dette så får du et component til formålet (TIBTransaction). Måden jeg gør det på i InterBase (via IBX) er som flg.

Jeg har et DataModule hvorpå jeg indsætter en TIBDatabase og en TIBTransaction (TIBDatabasen\'s \"DefaultTransaction\" sættes til at \"pege på\" TIBTransaction\'en og TIBTransaction\'s \"DefaultDatabase sættes til at \"pege på\" TIBDatabase\'n). På mine forms hvor jeg har noget dataaccess plejer jeg at indsætte en TIBTransaction således at jeg kan styre denne forms transaktioner uafhængig af andre forms.

Det du skal være klar over er at når du Commit\'er eller Rollback\'er din transaktion så lukkes de dataset der benytter denne (af samme årsag er det at jeg bruger flere TIBTransactions). Nedenstående er således noget kode jeg har klippet fra en applikation nettop til at udføre en opdatering i en transaktion
<SNIP>
Function _SetUserPassword(UserIdInt: Integer; DecryptedPassword: String) : Boolean;
var
  sqlUserPwd: TIBSql;
  trUserPwd: TIBTransaction;
  I: Integer;
begin
  Result := False;
  trUserPwd := TIBTransaction.Create(Nil);
  trUserPwd.Params.Text := DataModuleFccInterBase.trUserLogon.Params.Text;
  trUserPwd.DefaultDatabase := DataModuleFccInterBase.IB_FCCInterBase;
  sqlUserPwd := TIBSQL.Create(Nil);
  sqlUserPwd.Database := DataModuleFccInterBase.dsetUserLogon.Database;
  sqlUserPwd.Transaction := trUserPwd;
  sqlUserPwd.SQL.Text :=
    \'update USERS\' +#13+#10+
    \'set    PWD = \' + chr(39) + _EncryptPassword(DecryptedPassword) + chr(39)+ \',\' +#13+#10+
    \'      PWD_EXPIRED = 0\' +#13+#10+
    \'where  USERS.USERID_DB = \'+IntToStr(UserIdInt);
  I := 0;
  repeat
    Inc(I);
    if (I > 1) then Delay(_IbRetryDelayShort);
    if not trUserPwd.InTransaction then trUserPwd.StartTransaction;
    try
      sqlUserPwd.ExecQuery;
      trUserPwd.Commit;
      Result := True;
    except
      on exception do trUserPwd.Rollback;
    end;
  until (Result) or (I >= _IbRetryCountNormal);
end;
</SNIP>
Avatar billede kingpin Nybegynder
23. april 2001 - 08:03 #2
Et lidt forsinket accept fra min side, men tak for svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester