27. december 2000 - 11:49Der 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å.
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.
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>
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.
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\"
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.