AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Parameter unter Firedac
Thema durchsuchen
Ansicht
Themen-Optionen

Parameter unter Firedac

Ein Thema von Delbor · begonnen am 4. Mär 2016 · letzter Beitrag vom 11. Mär 2016
Antwort Antwort
Benutzerbild von DeddyH
DeddyH

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

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 14:21
Aus der Hilfe:
Zitat:
function ExecSQL(const ASQL: String; const AParams: array of Variant; const ATypes: array of TFieldType): LongInt; overload; ...

Die vierte überladene Methode führt die in ASQL angegebene SQL-Anweisung oder die Anweisung, die der Eigenschaft SQL zugewiesen ist, aus, wenn ASQL leer ist. Sie gibt die Anzahl der aktualisierten Zeilen zurück. AParams repräsentiert ein offenes Array von Parameterwerten.
ATypes repräsentiert ein offenes Array von Parameterdatentypen, die der Abfrage zugewiesen werden.
Delphi-Quellcode:
FDQuery1.ExecSQL('insert into mytab (f1, f2) values (:f1, :f2)',
  [100, 'qweqwe'], [ftInteger, ftWideString]);
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
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 21:25
Hi zusammen

Sorry, wenn ich erst jetzt antworte - ich bin im Moment sozusagen im "MultitaskModus". Im Schweizer Fernsehen läuft geradwe eine Sendung, in der Leute aus Stein im Kanton Appenzell Ferien in der Wohnung eines deutschen Ehepaars in Stein an der Nordsee machen und umgekehrt...
@Himitsu:
Unter der automatischen Parametererstellung wusste ich erstmal nicht, was ich darunter verstehen sollte. Die Variablen müssen ja auch so in der bekannten Form im SQL-String angegeben werden (xx).
Zitat:
Sooooooo unklar ist hier doch nicht, was passiert?
Die zitierten Zeilen brauchts ja auch nicht, wenn TFDResourceOptions.ParamCreate true ist. Aus:
Delphi-Quellcode:
SQLString := 'Insert Into Bildtabelle(Thumbnail) Values (:LThumbMemory)';
  FDQueryMain.SQL.Text := SQLString;
  FDQueryMain.Params.CreateParam(ftBlob, 'LThumbMemory', ptInput);
  FDQueryMain.Params[0].LoadFromStream(LThumbMemory, ftgraphic);
  FDQueryMain.ExecSQL(false);
würde, wenn ich das jetzt nicht gründlich missverstanden habe:
Delphi-Quellcode:
SQLString := 'Insert Into Bildtabelle(Thumbnail) Values (:LThumbMemory)';
  FDQueryMain.SQL.Text := SQLString;
  FDQueryMain.ExecSQL(false);
Da wird zwar die Variable übergeben. Aber allein aus diesen Zeilen geht nicht hervor, ob die auch wirklich parametrisiert werden.


Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 22:08
Es bedeutet ganz einfach, dass FireDAC nach Zuweisen des SQL-Strings nach Parametern sucht, welche als :ParamName deklariert sind und dann macht FireDAC das Params.CreateParam, für die gefundenen Parameter (nur halt Typlos, da es den DataTyp ja nicht kennt)

Delphi-Quellcode:
SQLString := 'Insert Into Bildtabelle(Thumbnail) Values (:LThumbMemory)';
FDQueryMain.Options.ParamCreate := False; // oder irgendwie so
FDQueryMain.SQL.Text := SQLString;
FDQueryMain.Params.CreateParam(ftBlob, 'LThumbMemory', ptInput);
FDQueryMain.ParamByName('LThumbMemory').irgendwas...; // oder FDQueryMain.Params[0].irgendwas...;
FDQueryMain.ExecSQL(false);
Delphi-Quellcode:
SQLString := 'Insert Into Bildtabelle(Thumbnail) Values (:LThumbMemory)';
FDQueryMain.Options.ParamCreate := True; // oder irgendwie so
FDQueryMain.SQL.Text := SQLString;
//FDQueryMain.Params.CreateParam(ftBlob, 'LThumbMemory', ptInput); // das macht FireDAC für dich
FDQueryMain.ParamByName('LThumbMemory').irgendwas...; // oder FDQueryMain.Params[0].irgendwas...;
FDQueryMain.ExecSQL(false);
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Parameter unter Firedac

  Alt 5. Mär 2016, 06:04
Hi himitsu

Vielen Dank! Das macht die Sache klarer! Ich dachte wirklich, der sucht das ':' und setzt den Parameter dann auch gleich ein!

Auffallend ist/finde ich, dass in allen Beispielen ParambyName verwendet wird und nicht der Feldindex, wobei sich Embarcadero da ja eindeutig ausspricht: treten zwei gleiche Parameternamen auf, wird der erste verwendet und der zweite fallengelassen. Dabei galt schon unter der altehrwürdigen BDE der Weg über die FeldIndexes als der Sicherere.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Parameter unter Firedac

  Alt 5. Mär 2016, 08:17
Der Index geht zwar schneller, aber wenn du z.B. mal am SQL was veränderst, dann ändert sich auch der Index, aber über den Namen gibt es niemals Probleme und im Code siehst auch schneller wo auf was zugegriffen wird.

Man nimmt ja auch meistens FieldByName und nicht Fields, wenn man auf die Felder zugreift.

Fallen gelassen wird nichts.
Der Parser geht von vorne nach hinden durch den String und die Parameter werden in der Reihenfolge in die Liste eingetragen, wie sie gefunden werden.
Kommt ein Parameter mehrmals im String vor, dann steht natürlich nur der "erste" Fund an seiner Stelle in der Liste und die nachfolgenden Funde werden nicht nochmal angehängt, da der Parameter dann ja schon existiert.

SELECT :a, :b, :a, :c
Delphi-Quellcode:
Params[0] = ParamByName('a')
Params[1] = ParamByName('b')
Params[2] = ParamByName('c')
SELECT :c, :b, :a, :a
Delphi-Quellcode:
Params[2] = ParamByName('a')
Params[1] = ParamByName('b')
Params[0] = ParamByName('c')
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 5. Mär 2016 um 08:22 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Parameter unter Firedac

  Alt 5. Mär 2016, 10:42
Hi zusammen
Zitat von Sir Rufo:
Zitat:
Die Parameter werden erzeugt in FireDAC.Phys.SQLPreprocessor.TFDPhysPreprocessor.E xecute
Zumindest wer mit Delphi XE8 arbeite, wird da nichts finden - es ist wohl nicht das erste Mal, dass sich in Firedac einniges ändert.
Ich häng hier einige jpegs an, die hoffentlich meine Suche etwas dokumentieren können.

Gruss
Delbor

PS: Da muss ich wohl ziemlich geschlafen haben:
Zitat:
C:\Program Files (x86)\Embarcadero\Studio\16.0\source\data\firedac\ stan\param nichts gefunden habe...
Angehängte Grafiken
Dateityp: jpg Präprozessor.JPG (46,4 KB, 12x aufgerufen)
Dateityp: jpg Präprozessor 2.JPG (40,8 KB, 9x aufgerufen)
Dateityp: jpg Präprozessor 3.JPG (125,3 KB, 10x aufgerufen)
Dateityp: jpg Präprozessor 4.JPG (30,0 KB, 5x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 5. Mär 2016 um 10:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Parameter unter Firedac

  Alt 5. Mär 2016, 11:42
Diese Klasse/Unit ist auch in Seattle nicht dokumentiert.

Nimm doch einfach den Debugger und stepp durch den Code. Wenn dir das zu langweilig ist, dann suche die Parameter-Klasse und setze einen Breakpoint im Create . Wenn dann dort angehalten wird, gehst du einfach durch den Callstack durch und findest die Stellen, die das aufrufen.

So mache ich das wenigtens und das führt eigentlich immer zum Erfolg.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:39 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