AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Fehlermeldung bei Eintrag in DB

Fehlermeldung bei Eintrag in DB

Ein Thema von zeras · begonnen am 28. Jan 2021 · letzter Beitrag vom 31. Jan 2021
Antwort Antwort
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.524 Beiträge
 
Delphi 11 Alexandria
 
#1

Fehlermeldung bei Eintrag in DB

  Alt 28. Jan 2021, 06:03
Datenbank: SQLITE • Version: 3.32.2 • Zugriff über: Firedac
Hallo,

ich möchte Daten aus Exceltabellen auslesen und in eine DB schreiben.
Das Auslesen klappt, nur beim Einfügen in die DB kommt es immer wieder zu Fehlermeldungen.
Es sieht so aus, als wenn die Inhalte aus manchen Feldern Zeichen enthalten, die Firedac "falsch" interpretiert.
Ich möchte die Daten aus den Excelfeldern genauso in eine DB schreiben, dass ich gegebenenfalls wieder eine Exceltabell mit selbem Inhalt erzeugen kann.
Außerdem möchte ich aber auch in den Daten in der DB suchen.

Delphi-Quellcode:
    SqlState := Format('INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES(%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);',
                   [TableNameKANummer,
                    feldKANummer,
                    ...............
                    QuotedStr(KAdata.McTyp),
                    ...............
Ich habe letztens gelesen, dass man QuotedStr nicht nutzen soll. Aber wie kann ich die Daten so in die DB schreiben, dass es keine Fehlermeldung gibt?
Miniaturansicht angehängter Grafiken
firedac-meldung.png  
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.932 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Fehlermeldung bei Eintrag in DB

  Alt 28. Jan 2021, 06:15
Moin...
Zitat:
Aber wie kann ich die Daten so in die DB schreiben, dass es keine Fehlermeldung gibt?
Parameter!

Delphi-Quellcode:
Qry.SQL.Text := 'insert into Blubb (Bla) values(:Bla)';
Qry.ParamByName('Bla').AsString := Feldwert;
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.524 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Fehlermeldung bei Eintrag in DB

  Alt 28. Jan 2021, 18:54

Delphi-Quellcode:
Qry.SQL.Text := 'insert into Blubb (Bla) values(:Bla)';
Qry.ParamByName('Bla').AsString := Feldwert;
Danke, das hat funktioniert. Werde das bei meinen nächsten Abfragen beachten.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.180 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Fehlermeldung bei Eintrag in DB

  Alt 28. Jan 2021, 19:35
Und QuoteStr solltest du unbedingt vergessen.
Irgendwo hat jede DB-Komponente eine Quote/Escape-Funktion, welche man unbedingt nutzen sollte. (wenn es nicht anders geht und man auf Biegen und Brechen SQLs manuell bauen will)

QuoteStr ist ausschließlich für PascalStrings da, nach der Syntax von Pascal/Delphi-Quellcode,
aber diese SQL-Syntax ist etwas komplett Anderes.


Tipp: Komm mal auf soeine "doofe" Idee, wie einer unserer Kunden, welche in alphanumerischen Artikelnummern nun auch noch ein ' verwenden wollten.
Die SQL-Params waren nicht das Problem, da wir (meistens) kein QuoteStr mehr für DB-Aufgaben nutzen, aber bei Übergabe ans Python, da rauchte QuoteStr wunderschön ab.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (28. Jan 2021 um 19:40 Uhr)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
433 Beiträge
 
Delphi XE6 Enterprise
 
#5

AW: Fehlermeldung bei Eintrag in DB

  Alt 29. Jan 2021, 09:52
Irgendwo hat jede DB-Komponente eine Quote/Escape-Funktion, welche man unbedingt nutzen sollte. (wenn es nicht anders geht und man auf Biegen und Brechen SQLs manuell bauen will)
Es gibt Szenarien, die durch Parameter nicht abgedeckt werden können, etwa "IN" mit einer variablen Anzahl Einträge. Wohl dem, dessen Datenbank temporäre Tabellen unterstützt: dann muss die SQL-Anweisung zerlegt werden die Erstellung einer temporären Tabelle mit einer Spalte, die die "IN-Werte" aufnimmt, das Füllen dieser Tabelle mit den Werten per INSERT mit Parameter und einem anschließenden Umbau der ursprünglichen Abfrage auf "IN (SELECT x FROM tmp)" oder auch einem JOIN.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.180 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Fehlermeldung bei Eintrag in DB

  Alt 29. Jan 2021, 11:40
Alle DBs haben APIs für Array-Parameter.
OK, in vielen DB-Komponenten ist das leider nicht eingebaut.

Na gut, in dem Fall bauen wir auch den String zusammen, geben ihn mit ParamByName als ein String rein und zerlegen ihn dann db-seitig in ein Array/Rows
oder er geht via MakroByName rein, aber da sind es meistens bloß Integer-Arrays und wenn nicht, dann wird wenigstens die "richtige" API verwendet.
z.B. pg_escape_string/pg_escape_literal oder TPgTextConverter.EscapeString
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.395 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Fehlermeldung bei Eintrag in DB

  Alt 31. Jan 2021, 15:14
Hallo,

Delphi-Quellcode:
    SqlState := Format('INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES(%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);',
                   [TableNameKANummer,
                    feldKANummer,
                    ...............
                    QuotedStr(KAdata.McTyp),
                    ...............
Ich habe letztens gelesen, dass man QuotedStr nicht nutzen soll. Aber wie kann ich die Daten so in die DB schreiben, dass es keine Fehlermeldung gibt?
Die Kollegen haben dir nur gezeigt, wie es besser geht, aber leider nicht gesagt was du das falsch machst.
Man baut SQLs NIEMALS als String zusammen und schon gar nicht, fügt man die Daten dort ein! Das ist ein NOGO!
Du erzeugt damit die Möglichkeit SQL-Injections zu machen. Das solltest du ganz dringend mal erforschen und nachlesen!
SQL-Injections werden übrigens viel eingebaut, weil viele das nicht richtig über Parameter lösen. Dadurch ist SQL-Injection eine der größten Sicherheitsprobleme, welche eingebaut werden:
siehe https://owasp.org/www-project-top-te...2017-Injection
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/channel/UCUG...aXLclwO9qA-lzA
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.524 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Fehlermeldung bei Eintrag in DB

  Alt 31. Jan 2021, 15:39

Die Kollegen haben dir nur gezeigt, wie es besser geht, aber leider nicht gesagt was du das falsch machst.
Man baut SQLs NIEMALS als String zusammen und schon gar nicht, fügt man die Daten dort ein! Das ist ein NOGO!
Du erzeugt damit die Möglichkeit SQL-Injections zu machen. Das solltest du ganz dringend mal erforschen und nachlesen!
SQL-Injections werden übrigens viel eingebaut, weil viele das nicht richtig über Parameter lösen. Dadurch ist SQL-Injection eine der größten Sicherheitsprobleme, welche eingebaut werden:
siehe https://owasp.org/www-project-top-te...2017-Injection
Danke für die Hinweise.
Da ich nicht so viel mit DB'S arbeite, habe ich mir den String zusammengebaut, damit ich sehe, was an die DB übergeben wird. An SQL Injection hatte ich dabei nicht gedacht.
Die Programme, wo ich DB's benutze, helfen mir bei meiner Arbeit. Jemand anderes wüsste garnicht, was man damit machen kann.
Aber man kann ja trotzdem von euch Profis lernen.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.180 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Fehlermeldung bei Eintrag in DB

  Alt 31. Jan 2021, 16:51
Nicht nur absichtliche SQL-Injections.
Schon alleine eine "falsche" Kodierung/Escaping können das SQL zerstören und das Programm wunderschön abrauchen lassen.

Siehe mein Beispiel mit ' in Texten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (31. Jan 2021 um 16:54 Uhr)
  Mit Zitat antworten Zitat
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 23:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf