![]() |
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:
Wenn ich jetzt auf dieser Form speicher(UPDATE), mach ich das so...
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;
Delphi-Quellcode:
Im Grunde, funktioniert alles. Ich denke aber, das ich das mit dem UPDATE wahrscheinlich einfacher machen kann. Die Create müsste eigendlich so OK.
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; Für Eure Ansicht dazu würde ich mich interessieren. Also schon mal danke. Gruß Jens |
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] |
Re: UPDATE Funktion SQL mit Firebird
Danke DeddyH, :thumb:
funktioniert, hab ich jetzt so umgebaut.
Delphi-Quellcode:
Ist der Rest vom Code so OK, oder kann man noch was verbessern.
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; Gruß Jens |
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.
|
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:
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.
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; Gruß Jens |
Re: UPDATE Funktion SQL mit Firebird
Du verlierst so nur einen Vorteil von parametrisierten Abfragen, da du die Abfrage jedesmal setzt
|
Re: UPDATE Funktion SQL mit Firebird
Zitat:
Wie verlier ich Vorteile? |
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.
|
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:
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.
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; 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 |
Re: UPDATE Funktion SQL mit Firebird
Wenn du
Delphi-Quellcode:
einmailg z.B. am Anfang zuweist oder fest hinterlegst, brauchst du nur noch die parameter senden.
QryVorgabe.SQL.Text := 'UPDATE ...';
|
Re: UPDATE Funktion SQL mit Firebird
Soll also heißen,
wenn ich diesen UPDATE Befehl direkt im OI der Query zuweise, brauche ich nur noch die Parameter senden. Allerdings, wenn ich die Parameter auch direkt der Query zuweise, kommt immer der Fehler, das die Parameter nicht bekannt sind. |
Re: UPDATE Funktion SQL mit Firebird
Zitat:
Später werden nur noch die Parameter gesendet und auf die vorbereitete Abfrage angewendet. Ohne Prepare erfolgt die Vorbereitung beim 1. Ausführen. |
Re: UPDATE Funktion SQL mit Firebird
Ich muss mal wirklich ganz dumm fragen, wie wende ich das an?
|
Re: UPDATE Funktion SQL mit Firebird
Was?
|
Re: UPDATE Funktion SQL mit Firebird
Liste der Anhänge anzeigen (Anzahl: 1)
Was du mir versuchst zu erklären.
Ich habe jetzt den UPDATE Befehl direkt in die Query eingetragen und dieser wurden scheinbar automatische aus dem UPDATE Befehl heraus die Params zugewiesen. Dann habe ich den SQL Befehl in meiner Anweisung entfernt und es getestet. Leider mit dem Fehler im Anhang.
Delphi-Quellcode:
Gruß Jens
procedure TMailSendenForm.SpeichernButtonClick(Sender: TObject);
begin ConPSConfig.Connect; QryVorgabe.Close; 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; |
Re: UPDATE Funktion SQL mit Firebird
Im OI siehst du die Parameter?
|
Re: UPDATE Funktion SQL mit Firebird
Liste der Anhänge anzeigen (Anzahl: 2)
Ja, und die weist mir der OI scheinbar auch allein zu. Lösche ich den SQL String im OI, werden die Params auch automatisch wieder entfernt.
Führe ich erst die Funktion ÜBERNEHMEN aus, geht danach auch SPEICHERN. Der Unterschied der zwei Funktion liegt lediglich daran, das in der einen noch der SQL Text vorhanden ist, und in der anderen, eigendlich der aus dem OI genutzt werden soll.
Delphi-Quellcode:
procedure TMailSendenForm.UebernehmenButtonClick(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'); end; |
Re: UPDATE Funktion SQL mit Firebird
Und du verwendest die Komponente zwischenzeitlich auch für keine anderen Abfragen?
|
Re: UPDATE Funktion SQL mit Firebird
Liste der Anhänge anzeigen (Anzahl: 1)
Nein,eigendlich nicht.
Ich häng mal das Unit an. Das einzige was vorher passiert, ich greife beim Programmstart, allerdings mit einer anderen Connection und auch einer anderen Query Komponente auf die Datenbank zu, um in meinem Hauptformular diese Daten nutzen zu können. Übrigens, in der jetzt angehangen Unit, ist der UPDATE Befehl, beim Spiechern wieder vorhanden, damit ich diese Funktion habe. Gruß Jens |
Re: UPDATE Funktion SQL mit Firebird
Du verwendest die Querykomponente wie vermutet mehrfach. Verwende verschiedene dafür.
|
Re: UPDATE Funktion SQL mit Firebird
Du hast recht,
ich habe es schon bemerkt, ich nutze sie auch für´s SELECT. Manchmal dauert es eindfach etwas länger. Muss ich für die UPDATE Funktionen auch verschiedene nutzen? Gruß Jens |
Re: UPDATE Funktion SQL mit Firebird
Sobald du der Eigenschaft .SQL etwas zuweist, werden die Parameter usw. gelöscht
|
Re: UPDATE Funktion SQL mit Firebird
Ja, das habe ich ja dann jetzt hinbekommen. Also entweder immer zuweisen, oder besser wenn Zuweisung Notwendig, eigene Query.
Jetzt habe ich noch drei Fragen dazu, 1. Wie kann ich ein MEMO in diese Datenbank einfügen. Auch als VARCHAR oder gibt es da was anders. 2. Muss man auch in gewissen Situationen verschieden CONNECTION Kompo´s nehmen. Außerdem... Zitat:
Gruß Jens |
Re: UPDATE Funktion SQL mit Firebird
Zitat:
|
Re: UPDATE Funktion SQL mit Firebird
Das ist genau das was ich in irgendeiner Anleitung gelesen habe. Leider kann ich diesen VariablenTyp in IBExpert nicht finden.
Da gibt es nur CHAR oder VARCHAR |
Re: UPDATE Funktion SQL mit Firebird
Liste der Anhänge anzeigen (Anzahl: 1)
Also bei mit gibt es den Typ
|
Re: UPDATE Funktion SQL mit Firebird
Liste der Anhänge anzeigen (Anzahl: 1)
Also bei mir auch, aber nur wenn ich ein neues Feld anlege. Da ich es vorher als VARCHAR hatte, geht das nachträglich nicht mehr. Seltsam, weil ich kann ja auch auf integer umstellen. Muss mit der Größe zu tun haben.
|
Re: UPDATE Funktion SQL mit Firebird
Das kann sein, denn Blobs sind keine normalen Felder. Leg mal ein neues Feld an
|
Re: UPDATE Funktion SQL mit Firebird
Ja, sag ich ja.
Ich habe jetzt einfach eine neue Domäne angelegt, und damit geht es auch. |
Re: UPDATE Funktion SQL mit Firebird
So, habe das mit dem try/Except Block eventuell doch alleine hinbekommen.
Ist das so OK. :gruebel:
Delphi-Quellcode:
Gruß Jens
procedure TMailSendenForm.SpeichernButtonClick(Sender: TObject);
begin ConPSConfig.Connect; QryVorgabeUPDATE.Close; QryVorgabeUPDATE.ParamByName('VORTEXT').AsString := MemoVortext.Text; QryVorgabeUPDATE.ParamByName('ANHANG').AsString := FileEdit.Text; QryVorgabeUPDATE.ParamByName('SEMAIL').AsString := FromMailEdit.Text; QryVorgabeUPDATE.ParamByName('EEMAIL1').AsString := AddMailEdit.Text; QryVorgabeUPDATE.ParamByName('EEMAIL2').AsString := AddMailEdit2.Text; QryVorgabeUPDATE.ParamByName('SMTP').AsString := SMTPEdit.Text; QryVorgabeUPDATE.ParamByName('BENUTZER').AsString := UserEdit.Text; QryVorgabeUPDATE.ParamByName('PASSWORT').AsString := PasswortEdit.Text; QryVorgabeUPDATE.ExecSQL; Try ConPSConfig.Commit; Except ConPSConfig.Rollback; ShowMessage('Daten wurden nicht gespeichert'); end; ShowMessage('Daten wurden gespeichert'); Close; end; |
Re: UPDATE Funktion SQL mit Firebird
Ich würde das eher so machen:
Delphi-Quellcode:
procedure TMailSendenForm.SpeichernButtonClick(Sender: TObject);
begin ConPSConfig.Connect; QryVorgabeUPDATE.Close; QryVorgabeUPDATE.ParamByName('VORTEXT').AsString := MemoVortext.Text; QryVorgabeUPDATE.ParamByName('ANHANG').AsString := FileEdit.Text; QryVorgabeUPDATE.ParamByName('SEMAIL').AsString := FromMailEdit.Text; QryVorgabeUPDATE.ParamByName('EEMAIL1').AsString := AddMailEdit.Text; QryVorgabeUPDATE.ParamByName('EEMAIL2').AsString := AddMailEdit2.Text; QryVorgabeUPDATE.ParamByName('SMTP').AsString := SMTPEdit.Text; QryVorgabeUPDATE.ParamByName('BENUTZER').AsString := UserEdit.Text; QryVorgabeUPDATE.ParamByName('PASSWORT').AsString := PasswortEdit.Text; Try QryVorgabeUPDATE.ExecSQL; ConPSConfig.Commit; ShowMessage('Daten wurden gespeichert'); Except ConPSConfig.Rollback; ShowMessage('Daten wurden nicht gespeichert'); end; Close; end; |
Re: UPDATE Funktion SQL mit Firebird
Danke,
klar, sonst würde Daten gespeichert ja immer kommen, habe ich gerade schon geändert. Aber Grundsätlich ist das richtig, und ich muss nichts weiteres machen. So könnte ich das jetzt bei jedem DatenBlock machen, und bekommen dann somit keiner Exeption mehr, sondern die Meldung das nicht gespeichert worden ist. Heißt aber auch, wenn ich das beim SELECT mache, könnte ich eine Expetion Behandlung schreiben, wenn die Daten nicht gelesen werden konnten. Also so...
Delphi-Quellcode:
Gruß JensQryVorgabeCreate.SQL.Text := 'SELECT * FROM VORGABE'; Try QryVorgabeCreate.open; Except ShowMessage('Daten konnten nicht gelesen werden'); QryVorgabeCreate.close; end; |
Re: UPDATE Funktion SQL mit Firebird
Kann man so machen, allerdings weiß man so nicht, was da schiefgegangen ist. Vielleicht besser in der Art:
Delphi-Quellcode:
try
//Code except on E: Exception do begin ShowMessage(Format('Beim Lesen ist ein Fehler aufgetreten. Meldung:%s%s',[sLineBreak,E.Message])); //weiterer Code end; end; |
Re: UPDATE Funktion SQL mit Firebird
Danke,
das hat mir jetzt echt gehofen. Ich weiß zwar nicht woran es gelegen hat, aber jetzt habe ich das endlich komplett verstanden. Jetzt weiß ich auch wie das mit der Repeat/Until Schleife in der Exeptionbehandlung aus Post '#5' genau gemacht wird. Man, manchmal glaubt man was zu verstehen, und hat es doch nicht verstanden. Jetzt aber und vor allem auch so, das ich es woanders umsetzten kann. Also nochmal herzlichen Dank an alle. Der Groschen ist gefallen. :thumb: Gruß Jens :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 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