Avatar billede nazaq Nybegynder
27. december 2000 - 11:49 Der er 4 kommentarer og
1 løsning

Delphi og Interbase

Hej og god Jul alle sammen

Jeg håber der er en der kan hjælpe mig med dette.

Jeg skal opdatere data på en interbase server og vil bruge transactions for at sikre at alle mine updates til forskellige tabeller i en database bliver opdateret. Jeg havde tænkt mig noget i denne stil:

with IbQuery1 do
begin
  Close;
  if Transaction.InTransaction then
    Transaction.Commit;
  Transaction.StartTransaction;
  try
    Close;
    SQL.Clear;
    SQL.Append(min sql streng nummer 1);
    Open;
    Close;
    SQL.Clear;
    SQL.Append(min sql streng nummer 2);
    Open;
    Transaction.Commit;
    Close;
  except
    Transaction.Rollback;
  end;
end;

Er dette rigtigt?
Vil det sikre at min .gdb bliver opdateret korrekt?
Og til sidst, hvordan kan jeg vise den exception der forårsager exceptionen? Lige som hvis jeg ikke havde exception handling på.

Nazaq
Avatar billede pellelil Nybegynder
27. december 2000 - 12:05 #1
Nu ville det havde hjulpet at du havde beskrevet hvilken version af Interbase vi taler om !?. Mine erfaringer er fra Interbase 6.x hvor jeg primært anvender IBX (InterBase Express) componenterne.

Avatar billede nazaq Nybegynder
27. december 2000 - 15:50 #2
Ja det er IB 6.0 og IBX jeg bruger
Avatar billede pellelil Nybegynder
27. december 2000 - 20:14 #3
Jamen så er det jo nemt :-)

Jeg kommer selv fra en MS-SQL baggrund og i den forbindelse så syntes jeg i starten at InterBase var en \"sær størrelse\", men det er lige indtil man vender sig til den.

Når du siger IBX, så \"forventer\" jeg at IbQuery1 er en TIBQuery og at Transaction er en TIBTransaction !?. Jeg skal ikke kunne sige om der \"findes\" en SQL.Append så jeg regner med at du mener SQL.Add !?

Først og fremmest skal du sikre dig hvilket \"Transactions-level\" du benytter. Dette kan du undersøge ved at dobbelt-klikke på din TIBTransaction. Jeg vil forslå at du vælger den der hedder \"ReadCommited\". Endvidere skal du vide at når du Commit\'er så lukkes din DataSource, og du skal således åbne den (manuelt) bagefter (det samme gælder for Commit). Hvis du således skal lave flere på hinanden følgende opdateringer så kan du i stedet bruge CommitRetaining, dette vil commite dine ændringer, men samtidig holde din DataSource åben.

Du skriver ikke noget om hvad dine \"sql stregne nummer x\" udføre, men jeg gætter på at de opdatere databasen og derved ikke udføre en \"søgning\" (SELECT). Er dette tilfældet så skal du i stedet for Open bruge \"ExecSQL\".

Jeg ville således vælge at skrive din kode som:
<SNIP>
with IbQuery1 do
begin
  if Active then Close;
  if Transaction.InTransaction then Transaction.Commit;
  Transaction.StartTransaction;
  try
    //Close;  *** Ingen grund til at lukke (allerede gjort) ***
    SQL.Clear;
    SQL.Add(min sql streng nummer 1);
    ExecSql;  // ExecSql; i stedet for Open
    //Close;  *** Ingen grund til at lukke (da ExecSql blot udføre SQL) ***
    SQL.Clear;
    SQL.Add(min sql streng nummer 2);
    ExecSql;  // ExecSql; i stedet for Open;
    Transaction.Commit;
    //Close;  *** Ingen grund til at lukke (da ExecSql blot udføre SQL) ***
  except
    Transaction.Rollback;
  end;
end;
</SNIP>
Avatar billede nazaq Nybegynder
27. december 2000 - 21:43 #4
Hej Pellelil

Ja det var hvad jeg også selv har fundet ud af :-)

Men ange tak for den med \'readcommitted\' den er meget brugbar.

Jeg kan godt lide at gå med livrem og seler så jeg laver altid en close på en query inden jeg ændre på SQL\'en.

Der er ingen problemer med at bruge open i stedet for execsql men det er nok en god ide at bruge den anden ved en update eller insert.

Jeg ved egentligt ikke hvorfor jeg hellere bruger append frem for add men det er nok gammel vane. SQL er jo en TStrings så forskellen er vel ikke stor hvis man ikke har brug for linie nummeret fra add.

Point til dig
Avatar billede pellelil Nybegynder
27. december 2000 - 23:00 #5
Glæder mig at jeg kunne hjælpe. Jeg var faktisk ikke klar over at der fandtes en append, men det er nog fordi add er gammel vane for mig :-)

\"Det rigtige\" er at bruge ExecSql når du laver opretter, retter og sletter. Hvor imod \"Open\" bør bruges når du \"select\'er\"
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