AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Insert-Statement nicht verstanden
Thema durchsuchen
Ansicht
Themen-Optionen

Insert-Statement nicht verstanden

Ein Thema von HerWin · begonnen am 6. Dez 2021 · letzter Beitrag vom 7. Dez 2021
Antwort Antwort
Seite 1 von 2  1 2      
HerWin

Registriert seit: 6. Dez 2021
5 Beiträge
 
#1

Insert-Statement nicht verstanden

  Alt 6. Dez 2021, 19:52
Datenbank: sqlite • Version: 3.36 • Zugriff über: Firedac
Hallo,
ich möchte eine SQLite-Datenbank mit Firedac nutzen.
Dazu habe ich mir das Beispiel GettingStarted aus Delphi 10.4 geladen.
Hier gibt es einen SQL Insert-Befehl, den ich nicht verstehe:

'insert into Categories(CategoryName, Description, Picture) ' +
'values(:N, :D, :P)', ['New category', 'New description', $0334])

Was bedeuted hier values(:N, :D, :P)?

Ich gehe davon aus, das sind die Feldnamen im DBGrid. Aber wo werden die
definiert? In der Datenbank stehen die richtigen Feldnamen (CategoryName...)
Ich kann, auch nach heftigem Suchen, nichts finden.
Leider gibt die Delphi-Beschreibung dazu nichts her.

Wenn mir das jemand erklärt, wäre ich dankbar.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Insert-Statement nicht verstanden

  Alt 6. Dez 2021, 20:31
Es handelt sich um SQL-Parameter. Damit kann man sein Statement einmalig deklarieren und muss lediglich die Parameterwerte neu belegen, wenn man z.B. mehrere Datensätze in einem Rutsch anlegen möchte. Ein weiterer Vorteil ist, dass Parameterwerte automatisch passend zum Typ maskiert werden, man schützt sich damit ganz nebenbei vor SQL-Injection.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
HerWin

Registriert seit: 6. Dez 2021
5 Beiträge
 
#3

AW: Insert-Statement nicht verstanden

  Alt 6. Dez 2021, 21:09
Hallo DeddyH,
danke für die Antwort. Ich habe es aber immer noch nicht verstanden.

Woher kommen die Buchstaben N, D und P?

Sollen das Datentypen sein? N = Numerisch, D = Dezimal? P = ???
Sind das einfach nur beliebige Bezeichner, die der Reihe nach abgearbeitet werden?

Wozu brauche ich das hier, wenn nur ein Datensatz verarbeitet wird (Schutz vor SQL-Injection)?

VG
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Insert-Statement nicht verstanden

  Alt 6. Dez 2021, 21:14
Ein SQL-Parameter beginnt immer mit einem Doppelpunkt. Danach kann jeder gültige Bezeichner kommen, den kannst Du frei vergeben. In diesem Beispiel könnte man theoretisch auch auf Parameter verzichten, müsste dann aber beispielsweise String-Werte selber quoten. Im realen Leben ist es aber meist eher so, dass die Werte eben nicht hartkodiert im Code stehen, sondern aus Benutzereingaben stammen. Diese sind grundsätzlich als potenziell gefährlich zu betrachten, da ist es äußerst wichtig, sich gegen SQL-Injection zu schützen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
HerWin

Registriert seit: 6. Dez 2021
5 Beiträge
 
#5

AW: Insert-Statement nicht verstanden

  Alt 6. Dez 2021, 21:16
Vielen Dank,

das muß ich mir ansehen.
  Mit Zitat antworten Zitat
Benutzerbild von Guido R.
Guido R.

Registriert seit: 5. Jul 2007
141 Beiträge
 
Delphi 12 Athens
 
#6

AW: Insert-Statement nicht verstanden

  Alt 7. Dez 2021, 01:35
Hallo HerWin!
Zitat:
Sollen das Datentypen sein? N = Numerisch, D = Dezimal? P = ???
Mein Tipp anhand des SQL-Befehls ist eher N = CategoryName, D = Description, P = Picture
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Insert-Statement nicht verstanden

  Alt 7. Dez 2021, 02:23
Um die Verwendung im Code zu verdeutlichen:

Delphi-Quellcode:
Query1.SQL.Text := 'INSERT INTO Categories (CategoryName, Description, Picture) VALUES (:N, :D, :P)';
Query1.ParamByName['N'].AsString := 'New category';
Query1.ParamByName['D'].AsString := 'New description';
Query1.ParamByName['P'].AsInteger := $0334;
Query1.Execute;
Das würde genau das ausführen, was du in deinem Beispiel gezeigt hast. Die möglichen Vorteile wurden ja bereits von DeddyH genannt. Zudem empfinde ich es schlicht als besseren Stil Parameter zu nutzen, statt umständlich in Strings umgewandelte und ''gequotedte'' Ausdrücke zu nehmen.

Man könnte die Parameter allerdings noch sprechender benennen für meinen Geschmack. Auch kann man sie statt mit ParamByName() indiziert via Params[i] referenzieren, finde ich aber nicht so schön, da dann die Reihenfolge im SQL-Statement wichtig wird. Man kann übrigens auch denselben Parameter mehrmals im selben SQL-Statement verwenden, was in manchen Fällen auch praktisch sein kann.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Insert-Statement nicht verstanden

  Alt 7. Dez 2021, 03:36
Hier war einfach nur wer schreibfaul, oder wollte Speicher sparen, und es geht natürlich auch länger:
Delphi-Quellcode:
Query1.SQL.Text := 'INSERT INTO Categories (CategoryName, Description, Picture) VALUES (:CategoryName, :Description, :Picture)';
Query1.ParamByName['CategoryName'].AsString := 'New category';
Query1.ParamByName['Description'].AsString := 'New description';
Query1.ParamByName['Picture'].AsInteger := $0334;
Query1.Execute;
Und da die Parameternamen grundsätzlich egal sind:
Delphi-Quellcode:
Query1.SQL.Text := 'INSERT INTO Categories (CategoryName, Description, Picture) VALUES (:mvsdnjkfdsa, :gbvös, :jmnfkeads)';
Query1.ParamByName['mvsdnjkfdsa'].AsString := 'New category';
Query1.ParamByName['gbvös'].AsString := 'New description';
Query1.ParamByName['jmnfkeads'].AsInteger := $0334;
Query1.Execute;
Es gibt auch Statements/DBMS/Datenbankkompoenten, die garkeine Namen nutzen, sondern nur durchnummerieren, wie z.B.
Delphi-Quellcode:
Query1.SQL.Text := 'INSERT INTO Categories (CategoryName, Description, Picture) VALUES ($0, $1, $2)';
Query1.Params[0].AsString := 'New category';
Query1.Params[1].AsString := 'New description';
Query1.Params[2].AsInteger := $0334;
Query1.Execute;
Wobei das .Params[123] natürlich auch bei den oberen Varianten im Programm genutzt werden kann.


Bei deinem Beispiel werden die Namen auch nicht verwendet, sondern einfach mit dem Array ['New category', 'New description', $0334] nacheinander die Parameter gefüllt werden, egal wie sie heißen.
$2B or not $2B

Geändert von himitsu ( 7. Dez 2021 um 03:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#9

AW: Insert-Statement nicht verstanden

  Alt 7. Dez 2021, 08:05
Moin...
Zitat:
sondern einfach mit dem Array ['New category', 'New description', $0334]
...imho kann es aber auch Komponenten geben, die die overload Variante mit dem Array nicht kennen. Deshalb würde ich eher die klassische Variante empfehlen.
Delphi-Quellcode:
Query1.SQL.Text := 'INSERT INTO Categories (CategoryName, Description, Picture) VALUES (:CategoryName, :Description, :Picture)';
Query1.ParamByName['CategoryName'].AsString := 'New category';
Query1.ParamByName['Description'].AsString := 'New description';
Query1.ParamByName['Picture'].AsInteger := $0334;
Query1.Execute;
SQL Injection: https://de.wikipedia.org/wiki/SQL-Injection
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.211 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Insert-Statement nicht verstanden

  Alt 7. Dez 2021, 13:37
Aufpassen! Der TE hat zu reinem SQL gefragt, da sind keine Komponenten im Spiel. Und die Frage bezog sich NUR auf die Namensgebung + das wurde sinngemäß ja beantwortet.

Code:
insert into Categories(CategoryName, Description, Picture) values(:N, :D, :P), ['New category', 'New description', $0334])
insert into Categories(CategoryName, Description, Picture) values(:Category, :Description, :Picture), ['New category', 'New description', $0334])
insert into Categories(CategoryName, Description, Picture) values(:stgt, :wrth, :wertb), ['New category', 'New description', $0334])
Tun alle das gleiche.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 07:40 Uhr.
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