AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Was sind parametrisierte SQL-Statements und wann anwenden?
Thema durchsuchen
Ansicht
Themen-Optionen

Was sind parametrisierte SQL-Statements und wann anwenden?

Ein Thema von juergen · begonnen am 5. Jun 2014 · letzter Beitrag vom 6. Jun 2014
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#1

Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 5. Jun 2014, 20:40
Datenbank: MS SQL, Firebird, Pervasive • Version: xxx • Zugriff über: nativ über entsprechende Komponente
Hallo zusammen,

immer wieder liest man hier etwas von "parametrisierten SQL-Statements" anwenden...
Z.B. auch heute:
Verwendest Du keine parametrisierten SQL-Statements?
<Sarcasm>So'n neumodisches Zeugs braucht doch eh niemand!</Sarcasm>
Dazu habe ich folgende Fragen:
1. Wann sollte man das anwenden?
2. Wie wendet man das an?
3. Was ist der Vorteil gegenüber einem normalen adden des SQL-Statements?

Ich würde mich über Antworten freuen welche ein Anfänger versteht. Ich will erst mal das "Grobe" verstehen, dann hoffe ich komme ich damit weiter.

Vielen Dank schon mal im Voraus!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 5. Jun 2014, 20:51
Zitat:
1. Wann sollte man das anwenden?
Ich verwende eigentlich so gut wie immer parametrsierte Abfragen.
Zitat:
2. Wie wendet man das an?
Anstatt der Werte trägt man Parameter (Variablen) ein. Die Abfrage wird dann vom SQL-Server geparst (vorbereitet). Bei der eigentlichen Abfrage werden dann nur noch die Werte-Tupel übertragen.
Zitat:
3. Was ist der Vorteil gegenüber einem normalen adden des SQL-Statements?
-System sorgt für richtiges Format
-kein Quoten o.ä. nötig
-sicherer gegenüber sql injection
-bei mehrfacher Ausführung muss die Abfarge nur einmal "kompilliert" werden (Parsse, Zurgriffsplan erstellen usw.)-> bessere Performance
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 5. Jun 2014, 21:07
@mkinzler,

schon mal Danke!

Den Punkt 2 verstehe ich noch nicht wie ich das umsetzen muss.
Angenommen ich habe eine Query. Die hat die Eigenschaft "Params".
Muss ich dort anstelle in "SQL" das Statement hinterlegen?

Wie müsste dann folgender Aufruf implementiert werden?
Code:
'select A.Name, A.Kd-Nr from Adressstamm as A'
//Edit: wobei A.Name = string und A.Kd-Nr = Integer
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 5. Jun 2014, 21:16
Parameter kann man natürlich nur setzen, wo auch welche sinnvoll sind. Deine Beispielabfrage lät sich nicht parametrisieren. Ein Beispiel wäre:

Code:
select A.Name, A.Kd-Nr from Adressstamm as A
where A.Kd-nr = :Kdnr
Den Parameter der Query füllst Du dann z.B. so und führst die Abfrage durch:
Delphi-Quellcode:
Query.Active := False;
Query.ParamByName('Kdnr') := '12345';
Query.Active := True;
Sinnvoll ist das besonders, wenn die selbe Abfrage in einer Schleife mehrfach ausgeführt werden soll. Je nach Intelligenz des Servers wird dann beim ersten Mal wie bereits von den anderern beschrieben, die Query vorbereitet und in den Folgeaufrufen nur noch der Parameterwert gesetzt.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 5. Jun 2014, 21:17
1: fast immer
2: kommt auf die Zugriffskomponenten drauf an, aber oftmals gibt es neben den FieldByName-Methoden auch die passenden ParamByName usw.
3: Sicherheit, Einfachheit, Sicherheit, Fehlerunanfälliger, Sicherheit, ...

Erstmal muß man die Strings nicht umständlich "quoten" und wenn man das nicht machen würde, dann ist man lebensmüde.

PS: Gerade das ist eines der Hauptgründe, warum sich jemand in irgendeine Webseite reinhacken konnte.
- Eingaben nicht oder nicht ausreichend geprüft
- Daten ungeschützt in SQLs eingebaut => Code-Injection

Stell es dir wie den Format-Befehl vor:
- Im SQL-String gibt es Platzhalter, welche dann mit den eigentlichen Werten gefüllt werden, wobei hierbei die Datenbank/Zugriffskomponenten quasi aber die zugewiesenen Werte prüfen.
- Außerdem kann es schneller werden, da der SQL-Parser das SQL nur einmal pürfen/auswerten muß und man dann ganz schnell viele Werte/Datensätze verarbeiten kann, indem man nur noch die Parameterwerte anpasst.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Jun 2014 um 21:19 Uhr) Grund: *schnarsch*
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 5. Jun 2014, 21:18
Das ist ein schlechtes Beispiel, da hier nichts parammetrisierbar ist

SQL-Code:
select
    A.Name,
    A.Kd-Nr
from
    Adressstamm
where
  A.Kd-Nr = :kdnr;
Der Parameter kdnr ist durch den Doppelpunkt erkennbar

Anderes Beispiel

SQL-Code:
insert into person ( vorname, name, gebdat, ...)
values ( :vorname, :name, :gebdat, ...) ;
Delphi-Quellcode:
Deklaration Abfrage und deren Vorbereitung:
Query.SQL.Text := <Abfrage>;
Query.PrepareSQL;
....
Ausführung der Abfrage (mehrmals möglich):
Delphi-Quellcode:
Query.ParamByName('vorname').Value := 'Hans';
Query.Params[1].Value := 'Mueller';
Query.ParamByName('gebdat').Value := ...;
Query.ExecuteSQL;
Query.ParamByName('vorname').Value := 'Susi';
Query.Params[1].Value := 'Mueller';
Query.ExecuteSQL;
Hans und Susi sind Zwillinge, der Nachname und das Geburtsdatum ist gleich.
Dem Parameter kannst Du direkt ein Datum zuweisen und musst Dir keine Gedanken um das Datumsformat machen.
Markus Kinzler

Geändert von mkinzler ( 5. Jun 2014 um 21:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 5. Jun 2014, 21:31
Ahhhh, supi, es lichtet sich so langsam. Danke an Alle!
Es geht doch nichts über anschauliche Beispiele. Dann werde ich das in Zukunft mit den Parameter-Übergaben so umsetzen.

Allen eine Gute N8!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 6. Jun 2014, 08:17
eine Anmerkung noch zu mkinzlers Beispiel: ich würde nicht unbedingt auf Value gehen, sondern direkt mit AsString, AsDate usw arbeiten, damit der zu erwartende Datentyp auchschon im Code klar ist:
Delphi-Quellcode:
Query.ParamByName('vorname').AsString := 'Hans';
Query.Params[1].AsString := 'Mueller';
Query.ParamByName('gebdat').AsDate := ...;
Query.ExecuteSQL;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von TRomano
TRomano

Registriert seit: 24. Nov 2004
Ort: Düsseldorf
190 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 6. Jun 2014, 08:18
Hallo zusammen,

ich sehe leider in verschiedenen Projekten Unmengen an String-Operationen, die immer wieder in Schleifen dasselbe SQL-Statement zusammen basteln, um die Parameter zu setzen.
Da gehen Statements bis in den Kilobyte-Bereich und keiner sieht mehr durch.
Es ist dort sinnvoller (aus Performance-Sicht und der Übersichtlichkeit wegen) ein SQL-Statement einmalig zu "basteln" (z.B. in einem Query-Tool) und die dann vielleicht 20 Parameter zu setzen. Das ganze Gedönse der unterschiedlichen Behandlung von Datums-Formaten (z.B.) entfällt auch.

Gruß Thomas
Thomas Forget
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Was sind parametrisierte SQL-Statements und wann anwenden?

  Alt 6. Jun 2014, 08:44
eine Anmerkung noch zu mkinzlers Beispiel: ich würde nicht unbedingt auf Value gehen, sondern direkt mit AsString, AsDate usw arbeiten, damit der zu erwartende Datentyp auchschon im Code klar ist:
Delphi-Quellcode:
Query.ParamByName('vorname').AsString := 'Hans';
Query.Params[1].AsString := 'Mueller';
Query.ParamByName('gebdat').AsDate := ...;
Query.ExecuteSQL;
Dann hat man u.U. aber viele unnötigen Cast-Operationen.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 08:24 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