Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi UPDATE Funktion SQL mit Firebird (https://www.delphipraxis.net/132516-update-funktion-sql-mit-firebird.html)

Jens Hartmann 14. Apr 2009 14:10

Datenbank: Firebird • Version: 2.1 • Zugriff über: ZEOS

UPDATE Funktion SQL mit Firebird
 
Hallo zusammen,

hab mal wieder eine Frage. Ich habe eine Form, in der ich diverse Daten konfiguriere. Diese Daten werden dann in einer Datenbank gespeichert.

Es gibt in dieser Datenbank zwar mehrere Spalten, aber immer nur mit einem Wert, da es nur Konfigurationseinstellungen sind.

Wenn ich diese Form aus meinem Programm Starte, lese ich beim Form Create die Daten Folgendermaßen ein...

Delphi-Quellcode:
procedure TMailSendenForm.FormCreate(Sender: TObject);
begin
  ConPSConfig.Connect;
  QryVorgabe.Close;
  QryVorgabe.SQL.Text := 'SELECT E_MAIL_ANHANG, EIGENE_E_MAIL, EMPFAENGER_E_MAIL1,'+
                         'EMPFAENGER_E_MAIL2,SMTP_SERVER, BENUTZERNAME_E_MAIL,'+
                         'PASSWORT_E_MAIL FROM VORGABE';
  QryVorgabe.Open;

  FileEdit.Text := QryVorgabe.FieldByName('E_MAIL_ANHANG').AsString;
  FromMailEdit.Text := QryVorgabe.FieldByName('EIGENE_E_MAIL').AsString;
  AddMailEdit.Text := QryVorgabe.FieldByName('EMPFAENGER_E_MAIL1').AsString;
  AddMailEdit2.Text := QryVorgabe.FieldByName('EMPFAENGER_E_MAIL2').AsString;
  SMTPEdit.Text := QryVorgabe.FieldByName('SMTP_SERVER').AsString;
  UserEdit.Text := QryVorgabe.FieldByName('BENUTZERNAME_E_MAIL').AsString;
  PasswortEdit.Text := QryVorgabe.FieldByName('PASSWORT_E_MAIL').AsString;

  QryVorgabe.Close;
  ConPSConfig.Disconnect;

  if CheckBox1.Checked then
    begin
    SMTPEdit.Enabled := true;
    SMTPRadioGroup.Enabled := false;
    end
  else
    begin
      SMTPEdit.Enabled := false;
      SMTPRadioGroup.Enabled := true;
    end;
end;
Wenn ich jetzt auf dieser Form speicher(UPDATE), mach ich das so...

Delphi-Quellcode:
procedure TMailSendenForm.SpeichernButtonClick(Sender: TObject);
begin
  ConPSConfig.Connect;
  QryVorgabe.Close;
  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET E_MAIL_ANHANG = :ANHANG';
  QryVorgabe.ParamByName('ANHANG').AsString := FileEdit.Text;
  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET EIGENE_E_MAIL = :SEMAIL';
  QryVorgabe.ParamByName('SEMAIL').AsString := FromMailEdit.Text;
  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET EMPFAENGER_E_MAIL1 = :EEMAIL1';
  QryVorgabe.ParamByName('EEMAIL1').AsString := AddMailEdit.Text;
  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET EMPFAENGER_E_MAIL2 = :EEMAIL2';
  QryVorgabe.ParamByName('EEMAIL2').AsString := AddMailEdit2.Text;
  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET SMTP_SERVER = :SMTP';
  QryVorgabe.ParamByName('SMTP').AsString := SMTPEdit.Text;
  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET BENUTZERNAME_E_MAIL = :BENUTZER';
  QryVorgabe.ParamByName('BENUTZER').AsString := UserEdit.Text;
  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET PASSWORT_E_MAIL = :PASSWORT';
  QryVorgabe.ParamByName('PASSWORT').AsString := PasswortEdit.Text;
  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;
  ShowMessage('Daten wurden gespeichert');
end;
Im Grunde, funktioniert alles. Ich denke aber, das ich das mit dem UPDATE wahrscheinlich einfacher machen kann. Die Create müsste eigendlich so OK.

Für Eure Ansicht dazu würde ich mich interessieren. Also schon mal danke.

Gruß Jens

DeddyH 14. Apr 2009 14:20

Re: UPDATE Funktion SQL mit Firebird
 
Du kannst das in einem Befehl zusammenfassen. Pseudo-SQL:
SQL-Code:
UPDATE Tabelle
SET Feld1 = Wert1, Feld2 = Wert2, Feld3 = Wert3,...
[WHERE Bedingung]

Jens Hartmann 14. Apr 2009 14:49

Re: UPDATE Funktion SQL mit Firebird
 
Danke DeddyH, :thumb:

funktioniert, hab ich jetzt so umgebaut.

Delphi-Quellcode:
procedure TMailSendenForm.SpeichernButtonClick(Sender: TObject);
begin
  ConPSConfig.Connect;
  QryVorgabe.Close;
  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET E_MAIL_ANHANG = :ANHANG,'+
                         'EIGENE_E_MAIL = :SEMAIL, EMPFAENGER_E_MAIL1 = :EEMAIL1,'+
                         'EMPFAENGER_E_MAIL2 = :EEMAIL2, SMTP_SERVER = :SMTP,'+
                         'BENUTZERNAME_E_MAIL = :BENUTZER,PASSWORT_E_MAIL = :PASSWORT';

  QryVorgabe.ParamByName('ANHANG').AsString := FileEdit.Text;
  QryVorgabe.ParamByName('SEMAIL').AsString := FromMailEdit.Text;
  QryVorgabe.ParamByName('EEMAIL1').AsString := AddMailEdit.Text;
  QryVorgabe.ParamByName('EEMAIL2').AsString := AddMailEdit2.Text;
  QryVorgabe.ParamByName('SMTP').AsString := SMTPEdit.Text;
  QryVorgabe.ParamByName('BENUTZER').AsString := UserEdit.Text;
  QryVorgabe.ParamByName('PASSWORT').AsString := PasswortEdit.Text;

  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  ShowMessage('Daten wurden gespeichert');

  Close;
end;
Ist der Rest vom Code so OK, oder kann man noch was verbessern.

Gruß Jens

DeddyH 14. Apr 2009 14:51

Re: UPDATE Funktion SQL mit Firebird
 
Ich würde noch einen try-except-Block drumherumsetzen, so dass bei einer Exception automatisch ein Rollback erfolgt. Ansonsten ist das IMHO ok so.

Jens Hartmann 14. Apr 2009 14:59

Re: UPDATE Funktion SQL mit Firebird
 
Da fehlen mir jetzt mal wieder so ein bißchen die Kenntnisse.

ich hab mal sowas gemacht, allerdings per Copy and Paste hier aus dem Forum.

Delphi-Quellcode:
  begin
  QryMB256PLUS.SQL.Clear;
  QryMB256PLUS.SQL.Text := 'SELECT FIRST 4000 * FROM MB100 ORDER BY ID DESC';
  if not QryMB256PLUS.Active then begin
    iError := 0;
    Repeat
      Try
        QryMB256PLUS.Open;
      Except
        on e : Exception Do begin
          sMessage := e.Message;
          Inc(iError);
          Application.ProcessMessages;
          Sleep(1000);
        end;
      end;
    until QryMB256PLUS.Active or (iError > 5); // <- bitte ausprobieren, ob 5 reicht oder eventuell höher sein muss.
    if iError > 5 then begin
      ShowMessage('Die Datenbank konnte mit ' + IntToStr(iError) + ' Versuchen nicht geöffnet werden.'
      + #13 + 'Die letzte Fehlermeldung lautete: ' + sMessage);
      Application.Terminate; // <- oder sonstige Fehlerbehandlung.
    end;
  end;
wie müsste ich das den hier machen. Oder besser, wie mache ich das im allgemeinen. Sollte das ja dann wahrscheinlich immer nach einem INSERT oder UPDATE machen. Evtl. auch bei SELECT.

Gruß Jens

mkinzler 14. Apr 2009 15:01

Re: UPDATE Funktion SQL mit Firebird
 
Du verlierst so nur einen Vorteil von parametrisierten Abfragen, da du die Abfrage jedesmal setzt

Jens Hartmann 14. Apr 2009 16:38

Re: UPDATE Funktion SQL mit Firebird
 
Zitat:

Zitat von mkinzler
Du verlierst so nur einen Vorteil von parametrisierten Abfragen, da du die Abfrage jedesmal setzt


Wie verlier ich Vorteile?

mkinzler 14. Apr 2009 18:08

Re: UPDATE Funktion SQL mit Firebird
 
Weil du bei jedem Update wieder die Abfrage setzt. Diese wird dann an das DBMS übertragen, dort geparst, eine Zugriffsplan erstellt und anschliessend die Parameter übertragen und auf den Plan ausgeführt. Sendest du die Abfrage nur einmal, werden beim 2. Update nur noch die parameter übertragen.

Jens Hartmann 14. Apr 2009 19:34

Re: UPDATE Funktion SQL mit Firebird
 
Sorry Markus,

aber ich versteh noch nicht so ganz was Du meinst. Was der Vorteil ist, habe ich zwar verstanden, aber ich führe ja nur folgende Funktion als UPDATE aus.

Delphi-Quellcode:
procedure TMailSendenForm.SpeichernButtonClick(Sender: TObject);
begin
  ConPSConfig.Connect;
  QryVorgabe.Close;
  QryVorgabe.SQL.Text := 'UPDATE VORGABE SET E_MAIL_ANHANG = :ANHANG,'+ 
                         'EIGENE_E_MAIL = :SEMAIL, EMPFAENGER_E_MAIL1 = :EEMAIL1,'+ 
                         'EMPFAENGER_E_MAIL2 = :EEMAIL2, SMTP_SERVER = :SMTP,'+ 
                         'BENUTZERNAME_E_MAIL = :BENUTZER,PASSWORT_E_MAIL = :PASSWORT';

  QryVorgabe.ParamByName('ANHANG').AsString := FileEdit.Text;
  QryVorgabe.ParamByName('SEMAIL').AsString := FromMailEdit.Text;
  QryVorgabe.ParamByName('EEMAIL1').AsString := AddMailEdit.Text;
  QryVorgabe.ParamByName('EEMAIL2').AsString := AddMailEdit2.Text;
  QryVorgabe.ParamByName('SMTP').AsString := SMTPEdit.Text;
  QryVorgabe.ParamByName('BENUTZER').AsString := UserEdit.Text;
  QryVorgabe.ParamByName('PASSWORT').AsString := PasswortEdit.Text;

  QryVorgabe.ExecSQL;
  ConPSConfig.Commit;

  ShowMessage('Daten wurden gespeichert');

  Close;
end;
Dabei ist es ja so, das diese Werte ja schon so in den EDIT-Feldern (fertig oder geändert) stehen, und daher führe ich ja keine Abfrage mehr durch.

Eine erneute Abfrage benötige ich ja nur im Hauptformular, wenn diese Daten Notwendig sind, oder wenn ich das Konfiguationsform erneut aufrufe, um wieder Änderungen durchzufüheren.

Gruß Jens

mkinzler 14. Apr 2009 19:37

Re: UPDATE Funktion SQL mit Firebird
 
Wenn du
Delphi-Quellcode:
QryVorgabe.SQL.Text := 'UPDATE ...';
einmailg z.B. am Anfang zuweist oder fest hinterlegst, brauchst du nur noch die parameter senden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz