update

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

update

Beitrag von Joachim Raap »

hallo, warum bekomme ich beim Befehl unten die Fehlermeldung "Unknown column 'IntID' in where-clause'? In der Datenbank ist id der Primärschlüssenl und als Integer definiert; IntID ist ebenfalls ein integer und enthält die ID des gelesenen Satzes?

Code: Alles auswählen

FMGruppen.SQLQuery1.SQL.Text:='update test set bez='''+'Gruppe 27.1'+''' WHERE id=IntID;';

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: update

Beitrag von Eb »

Ich vermute, dass IntID eine Lazarus-Variable ist.
Dann müsstest du es so schreiben

Code: Alles auswählen

FMGruppen.SQLQuery1.SQL.Text:='update test set bez='''+'Gruppe 27.1'+''' WHERE id=' + inttostr(IntID) + ';';

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: update

Beitrag von Joachim Raap »

........und schon funktioniert es. Danke

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: update

Beitrag von af0815 »

Ich würde mich vom Fehleranfälligen Stringgefrickel mal lösen. Das ist weder vernünftig lesbar = siehe Fehler der entstanden ist, noch wartbar = erzwingt später wieder diese Fehler.

Ausserdem extrem anfällig bzw. einer der Hauptgründe für Scriptinjection.

https://wiki.freepascal.org/SqlDBHowto/ ... er_Abfrage
https://de.wikipedia.org/wiki/SQL-Injection
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: update

Beitrag von Joachim Raap »

ja af0815, das mache ich auch wenn ich irgendwann mal die Parametriesierung verstanden habe....

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: update

Beitrag von af0815 »

Joachim Raap hat geschrieben:
Sa 26. Nov 2022, 23:09
ja af0815, das mache ich auch wenn ich irgendwann mal die Parametriesierung verstanden habe....
Und wo ist das Problem ? Einfach einen Doppelpunkt vor dem Parameternamen. Und im Text je nachdem wie du das SQL Statement eingetragen hast, zuerst den Parameter erzeugen und dann einen Wert zuweisen. Ist in den diversen Beispielen in der Freepascal Wiki erklärt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: update

Beitrag von Joachim Raap »

das Problem af0815 liegt darin, daß ich die Hinweise zwar gesehen habe aber mich damit noch nicht beschäftigt habe.......
Wie gesagt - steht auf der ToDo-Liste. Gib mir noch etwas Zeit

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: update

Beitrag von Joachim Raap »

#eb
ich bekomme es heute nicht hin; ich bin der Meinung, daß ich alles richtig abgeschrieben habe; aber er (die Dabenbank) speichert nicht. Ich kann aber auch keinen Schreibfehler sehen; kannst Du etwas entdecken?

Code: Alles auswählen

                           FMMenu.SQLQuery1.SQL.Text:='update gruppen set Ktn='+IntToStr(IntGrpKtn)+' where ID='+IntToStr(IntGrpID)+';';

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: update

Beitrag von af0815 »

setze mal die Nummern direkt ins Statement und schau ob das erwartete Ergebnis kommt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: update

Beitrag von charlytango »

- oder lass dir nach der Zuweisung den zusammengebauten Text nochmal anzeigen

Code: Alles auswählen

showmessage(FMMenu.SQLQuery1.SQL.Text);
um zu prüfen ob das Statement auch korrekt ist.

-- oder riskiere zwei Zeilen mehr Tipparbeit

Code: Alles auswählen

var s:string;
.....
s:='update gruppen set Ktn='+IntToStr(IntGrpKtn)+' where ID='+IntToStr(IntGrpID)+';'
FMMenu.SQLQuery1.SQL.Text:=s; //<-- Breakpoint hier setzen
um mit offenem Debug Fenster für lokale Variablen ( Ctrl+Alt+L ) direkt das Statement in der Variablen s abgreifen zu können.
Die kannst du dann direkt gegen die DB testen und sehen ob es am Statement liegt. Ohne eine Möglichkeit SQL-Statements direkt gegen die DB Testen zu können kannst du ohnehin keine ernsthafte SQL-Entwicklung machen.

Ich nehme an du hast deinen Code auch entsprechend gegen Exceptions die zb von der DB-Bibliothek ausgelöst wurden gesichert.

Code: Alles auswählen

  try
    FMGruppen.SQLQuery1.Execute;
  except
    On E :Exception do begin
      ShowMessage(E.Message);
    end;
  end;

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: update

Beitrag von af0815 »

Ein Beispiel wo alles drinnen sein sollte.

Code: Alles auswählen

  try
    FMGruppen.SQLQuery1.Active:= false;
    FMGruppen.SQLQuery1.Clear;
    FMGruppen.SQLQuery1.Options:= [sqoAutoApplyUpdaten,sqoAutoCommit];
    FMGruppen.SQLQuery1.Text:= 'update gruppen set Ktn= :SQLKtn where ID= :SQLID;'
    FMGruppen.SQLQuery1.ParamByName('SQLKtn').AsInteger:= IntGrpKtn;
    FMGruppen.SQLQuery1.ParamByName('SQLID').AsInteger:= IntGrpID;
    FMGruppen.SQLQuery1.Execute;
  except
    On E :Exception do begin
      ShowMessage('Exception = '+E.Message);
    end;
  end;
Ein kleiner Hinweis, wenn man das SQL-Statement mit ADD() hinzufügt, dann muss man die Parameter im Programm erzeugen, weil das Statement nicht geparsed wird. Hat Vorteile und Nachteile.

Bei den ParameterNamen nehme ich immer den Namen der Spalte und hänge vorne ein 'SQL' dran. Damit ist immer ganz klar was Parameter ist und was nicht und man verschreibt sich weniger.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: update

Beitrag von Joachim Raap »

ist mir sehr peinlich - ich habe schlicht vergessen den "SQLexec" loszutreten; dafür direkt die Datenbank geschlossen......
Danke für Eure Mühe

#af0815 -> da sind sie wieder, die Parameter! ja o.k., ich werde mich jetzt damit beschäftigen

Antworten