03. april 2001 - 10:21Der 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
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>
Et lidt forsinket accept fra min side, men tak for svar
Synes godt om
Ny brugerNybegynder
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.