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
Seite 1 von 4  1 23     Letzte »    
Delbor

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

Parameter unter Firedac

  Alt 4. Mär 2016, 12:47
Datenbank: MySQL • Version: 5.9xxx • Zugriff über: Firedac
Hi zusammen

Das hier ist eine der Proceduren, die ablaufen, wenn ein Bild in meine DB aufgenommen werden soll. Eingeführt wurde sie unter DBExpress; Jetzt, unter Firedac, hab ich bis auf das beteiligte Query nichts geändert. Auch in den andern Proceduren nicht. Und es tut genau, was es soll.
In den letzten Tagen habe ich wohl beinahe "jeden Stein umgedreht" nach der Suche, wie Firedac mit Abfrageparametern umgeht. Die entsprechenden Codebeispiele von Embarcadero arbeiten alle mit "ParamsByName.(..).add." ohne die Parameter (oder wenigstens die Parameter-Collection) vorher zu erzeugen.
Auch in den Sourcen habe ich keinen Hinweis darauf gefunden, dass und wo die Params-Collection erzeugt werden. Und da selbst Delphi es nicht schafft, mit nichterzeugten Objekten zu arbeiten ( ):
  • Wieso das untenstehende funktioniert, kannn ich mir mit gutem Willen ja noch vorstellen
  • Wenn unter Firedac die Parameter-Items (CollectionItems) nur hinzugefügt werden müssen,
  • warum funktioniert meinn Zeugs, obwohl ich 3 zusätzliche Parameter erzeuge?

Delphi-Quellcode:
procedure TFDMySQLDml.kategorien_bildDescribeTabelleInsert(BildDescribeLastID: Integer;bildtabelle_idbild: Integer);
  var kategorien_tabelle_Kath_ID, BildDescribeTabelle_BilddesribeID,
      BildDescribeTabelle_Bildtabelle_idBild: Integer;
      SQLString: String;
begin
  kategorien_tabelle_Kath_ID := ApplicationManager.CategoryKey;
  BildDescribeTabelle_BilddesribeID := BildDescribeLastID;
  BildDescribeTabelle_Bildtabelle_idBild := bildtabelle_idbild;
  SQLString := 'Insert Into kategorien_tabelle_has_bildDescribeTabelle'+
                            '(kategorien_tabelle_Kath_ID,'+
                            'BildDescribeTabelle_BilddesribeID,' +
                            'BildDescribeTabelle_Bildtabelle_idBild) ' +
                            'Values (:kategorien_tabelle_Kath_ID,' +
                                    ':BildDescribeTabelle_BilddesribeID,' +
                                    ':BildDescribeTabelle_Bildtabelle_idBild)';
  if (FDQueryMain.Active) then
    FDQueryMain.Active := False;
  FDQueryMain.SQL.Text := SQLString;
  FDQueryMain.Params.CreateParam(ftinteger, 'kategorien_tabelle_Kath_ID', ptInput);
  FDQueryMain.Params.CreateParam(ftInteger, 'BildDescribeTabelle_BilddesribeID', ptInput);
  FDQueryMain.Params.CreateParam(ftInteger, 'BildDescribeTabelle_Bildtabelle_idBild', ptInput);
  FDQueryMain.Params[0].AsInteger := kategorien_tabelle_Kath_ID;
  FDQueryMain.Params[1].AsInteger := BildDescribeTabelle_BilddesribeID;
  FDQueryMain.Params[2].AsInteger := BildDescribeTabelle_Bildtabelle_idBild;
  FDQueryMain.ExecSQL(false);
  FReportList.Add(' -TPicAdmin.kategorien_bildDescribeTabelleInsert');
end;
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 Sir Rufo
Sir Rufo

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

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 13:02
Die Parameter werden erzeugt in FireDAC.Phys.SQLPreprocessor.TFDPhysPreprocessor.Execute
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
Benutzerbild von himitsu
himitsu

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

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 13:12
Fast alle DBZugriffskomponenten sollten die Parameter selber ertstellen, anhand des übergebenen SQL.
Außer man hat diese Funktion deaktiviert, wo die Komponente das SQL parst, nachdem es zugewiesen/geändert wurde.

Delphi-Quellcode:
FDQueryMain.SQL.Text := SQLString;
FDQueryMain.Params[0].AsInteger := kategorien_tabelle_Kath_ID;
FDQueryMain.Params[1].AsInteger := BildDescribeTabelle_BilddesribeID;
FDQueryMain.Params[2].AsInteger := BildDescribeTabelle_Bildtabelle_idBild;
FDQueryMain.ExecSQL(false);

// oder
FDQueryMain.SQL.Text := SQLString;
FDQueryMain.ParamByName('kategorien_tabelle_Kath_ID').AsInteger := kategorien_tabelle_Kath_ID;
FDQueryMain.ParamByName('BildDescribeTabelle_BilddesribeID').AsInteger := BildDescribeTabelle_BilddesribeID;
FDQueryMain.ParamByName('BildDescribeTabelle_Bildtabelle_idBild').AsInteger := BildDescribeTabelle_Bildtabelle_idBild;
FDQueryMain.ExecSQL(false);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 13:18
Und speziell FireDAC hat da schöne Überladungen, so dass man auch mit ganz wenig Code auskommt.
Query.ExecSQL('INSERT INTO Tabelle(Feld1, Feld2, Feld3) VALUES(:Wert1, :Wert2, :Wert3)', [1, 2, 3], [ftInteger, ftInteger, ftInteger]);
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.186 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 14:06
Hi zusammen

Vielen Dank für eure aufschlussreichen Antworten!

Zitat:
Die Parameter werden erzeugt in FireDAC.Phys.SQLPreprocessor.TFDPhysPreprocessor.E xecute
Danke,Sir Rufo! Schau ich mir mal an. Kein Wunder, dass ich unter
C:\Program Files (x86)\Embarcadero\Studio\16.0\source\data\firedac\stan\param nichts gefunden habe...
@DeddyH:
Zitat:
Query.ExecSQL('INSERT INTO Tabelle(Feld1, Feld2, Feld3) VALUES(:Wert1, :Wert2, :Wert3)', [1, 2, 3], [ftInteger, ftInteger, ftInteger]);
Das wirkt jetzt auf den ersten Blick etwas gewöhnungsbedürftig. Aber soweit ich sehe, ist das mit meinem Monster identisch.
Und wenn ich mehrere Zeilen draus mache, gehts übersichtlicher wirklich nicht mehr, ist aber immer noch viel kleiner:
Delphi-Quellcode:
Query.ExecSQL('INSERT INTO Tabelle(Feld1, Feld2, Feld3),'+
                            ' VALUES(:Wert1, :Wert2, :Wert3)',
                                    [1, 2, 3],
                                    [ftInteger, ftInteger, ftInteger]);
Wobei Gruppe 3 offenbar die Indexes enthält. Ich werde das gleich hier mal umsetzen und auch die andern Prozeduren anpassen. Auch wenn das Ding genau(?) das getan hat, was es soll: die "Createparams" von DBExpress sind nicht nur überflüssig, sondern auch zuviel des Guten.

Zitat:
Fast alle DBZugriffskomponenten sollten die Parameter selber ertstellen, anhand des übergebenen SQL.
Außer man hat diese Funktion deaktiviert, wo die Komponente das SQL parst, nachdem es zugewiesen/geändert wurde.
@ himitsu:
Das FDQuery (Unter anderen) hat ein entsprechendes Boolean-Property - dessen Name hab ich inzwischen vergessen. Aber irgendwie ist es mir och lieber, ich übergebe die Parameter selber. Ist vielleicht etwas mehr Typarbeit, dafür ist klar, was abläuft.


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
43.142 Beiträge
 
Delphi 12 Athens
 
#6

AW: Parameter unter Firedac

  Alt 4. Mär 2016, 14:18
Wobei Gruppe 3 offenbar die Indexes enthält.
Nee, das sind einfach "irgendwelche" Werte.

statt [1, 2, 3] ist natürlich [kategorien_tabelle_Kath_ID, BildDescribeTabelle_BilddesribeID, BildDescribeTabelle_Bildtabelle_idBild] gemeint.

dafür ist klar, was abläuft.
Sooooooo unklar ist hier doch nicht, was passiert?
Delphi-Quellcode:
FDQueryMain.SQL.Text := SQLString;
FDQueryMain.ParamByName('kategorien_tabelle_Kath_ID').AsInteger := kategorien_tabelle_Kath_ID;
FDQueryMain.ParamByName('BildDescribeTabelle_BilddesribeID').AsInteger := BildDescribeTabelle_BilddesribeID;
FDQueryMain.ParamByName('BildDescribeTabelle_Bildtabelle_idBild').AsInteger := BildDescribeTabelle_Bildtabelle_idBild;
FDQueryMain.ExecSQL(false);
Gut, FireDAC wird bei falschen Typen nicht meckern können, aber spätestens das DBMS wird es dann tun.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#7

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.186 Beiträge
 
Delphi 11 Alexandria
 
#8

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
43.142 Beiträge
 
Delphi 12 Athens
 
#9

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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delbor

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

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
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 15:48 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