AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Stored Procedure: Rückgabewert

Stored Procedure: Rückgabewert

Ein Thema von fkerber · begonnen am 11. Mär 2011 · letzter Beitrag vom 18. Mär 2011
Antwort Antwort
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.879 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Stored Procedure: Rückgabewert

  Alt 12. Mär 2011, 10:53
Zitat:
@Markus:
Hätte das gegenüber obigen einen Vorteil oder ist es nur "anders"?
In diesem Fall nur anders.

Wg Tranaktionen:
Bei FireBird ist aber zu beachten, dass keine Transaktionslog verwendet wird, wie bei den meisten anderen DBMS, sondern Datensatzversionierung.
Deshalb ist diese auch bei/für nicht ändernde Vorgänge wichtig.
Markus Kinzler
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#2

AW: Stored Procedure: Rückgabewert

  Alt 12. Mär 2011, 11:09
Hallo Frederic,

dein Verständnis zu Transaktionen sind prinzipiell richtig. Das Ganze in Verbindung mit Firebird wäre jetzt eine etwas längere Geschichte, aber prinzipiell ist ein ständiges COMMIT RETAINING (eine spezielle Form von COMMIT, wo der Transaktionskontext erhalten bleibt) über eine längere Dauer für den Firebird Server nicht gut, weil hiermit das Fortschreiten der "Oldest Active Transaction" blockiert wird. Ich erwähne das deswegen, weil jeglicher AutoCommit Modus ein COMMIT RETAINING verwendet. Man muss dann schon mal von Zeit zu Zeit ein COMMIT anstatt von COMMIT RETAINING ausführen, damit man hier nicht in ein Performanceproblem reinläuft. Dazu am besten die Transaktions-Counter (ermittelbar über gstat -h oder Admin/Dev-Tool) im Auge behalten.

Gerade für deinen Anwendungsfall, wo es um das Anlegen eines Benutzers geht, würde ich eine explizit gestartete Transaktion vorziehen. Wer weiss, wer sonst noch die interne/implizite Transaktion der Connection in Verwendung hat. Ist sauberer und frei von Seiteneffekten, weil man hier mit der eigenen Transaktion alles selbst im Griff hat.

Was ich gerne mit AutoCommit verwende sind Datenmengen, die im Kontext einer ReadOnly-Transaktion geöffnet wurden, sofern die Datensätze nicht bearbeitet werden müssen.

Thomas
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#3

AW: Stored Procedure: Rückgabewert

  Alt 12. Mär 2011, 11:51
Hi,

das sit natürlich gut zu wissen.
Danke für die Erläuterung.

LG, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#4

AW: Stored Procedure: Rückgabewert

  Alt 12. Mär 2011, 14:07
Hi,

das Ganze sieht dann nun so aus (und funktioniert auch):

Delphi-Quellcode:
var
  proc: TIBCStoredProc;
  ta: TIBCTransaction;
begin
  ta := TIBCTransaction.Create(nil);
  ta.DefaultConnection := ibc_mainDB;
  proc := TIBCStoredProc.Create(nil);
  proc.Transaction := ta;
  proc.StoredProcName := 'CREATECUSTOMER';
  proc.Prepare;
  proc.ParamByName('name').Value := custName;
  proc.ParamByName('title').Value := title;
  proc.ParamByName('forename').Value := forename;
  proc.ParamByName('surname').Value := surname;
  proc.ParamByName('street').Value := street;
  proc.ParamByName('houseNo').Value := houseNo;
  proc.ParamByName('country').Value := Uppercase(country);
  proc.ParamByName('zipcode').Value := zipcode;
  proc.ParamByName('cityname').Value := cityname;
  proc.ExecProc;
  result := proc.ParamByName('contactid').AsInteger;
  proc.Close;
  ta.Commit;
  proc.Free;
  ta.Free;
end;
Ist das dann so ok?


LG, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#5

AW: Stored Procedure: Rückgabewert

  Alt 12. Mär 2011, 18:50
Sieht ganz gut aus. Ich würde noch das Close weg geben und ein sauberes Exception-Handling machen. In etwa so:

Delphi-Quellcode:
var
  proc: TIBCStoredProc;
  ta: TIBCTransaction;
begin
  ta := TIBCTransaction.Create(nil);
  ta.DefaultConnection := ibc_mainDB;
  proc := TIBCStoredProc.Create(nil);
  proc.Transaction := ta;
  try
    ta.StartTransaction;
    try
      proc.StoredProcName := 'CREATECUSTOMER';
      proc.Prepare;
      proc.ParamByName('name').Value := custName;
      proc.ParamByName('title').Value := title;
      proc.ParamByName('forename').Value := forename;
      proc.ParamByName('surname').Value := surname;
      proc.ParamByName('street').Value := street;
      proc.ParamByName('houseNo').Value := houseNo;
      proc.ParamByName('country').Value := Uppercase(country);
      proc.ParamByName('zipcode').Value := zipcode;
      proc.ParamByName('cityname').Value := cityname;
      proc.ExecProc;
      result := proc.ParamByName('contactid').AsInteger;
      ta.Commit;
    except
      ta.Rollback;
      raise;
    end;
  finally
    proc.Free;
    ta.Free;
  end;
end;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#6

AW: Stored Procedure: Rückgabewert

  Alt 13. Mär 2011, 13:05
Dankeschön!
Frederic Kerber
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Stored Procedure: Rückgabewert

  Alt 13. Mär 2011, 13:26
kleine Korrektur...
Delphi-Quellcode:
var
  proc: TIBCStoredProc;
  ta: TIBCTransaction;
begin
  ta := TIBCTransaction.Create(nil);
  proc := TIBCStoredProc.Create(nil);
  try
    proc.Transaction := ta;
    ta.DefaultConnection := ibc_mainDB;
    ta.StartTransaction;
    try
      proc.StoredProcName := 'CREATECUSTOMER';
      proc.Prepare;
      proc.ParamByName('name').Value := custName;
      proc.ParamByName('title').Value := title;
      proc.ParamByName('forename').Value := forename;
      proc.ParamByName('surname').Value := surname;
      proc.ParamByName('street').Value := street;
      proc.ParamByName('houseNo').Value := houseNo;
      proc.ParamByName('country').Value := Uppercase(country);
      proc.ParamByName('zipcode').Value := zipcode;
      proc.ParamByName('cityname').Value := cityname;
      proc.ExecProc;
      result := proc.ParamByName('contactid').AsInteger;
      ta.Commit;
    except
      ta.Rollback;
      raise;
    end;
  finally
    proc.Free;
    ta.Free;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz