![]() |
Datenbank: MySQL • Version: 5.9xxx • Zugriff über: Firedac
Parameter unter 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 ( :wink:):
Delphi-Quellcode:
Gruss
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; Delbor |
AW: Parameter unter Firedac
Die Parameter werden erzeugt in
Delphi-Quellcode:
FireDAC.Phys.SQLPreprocessor.TFDPhysPreprocessor.Execute
|
AW: Parameter unter Firedac
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); |
AW: Parameter unter Firedac
Und speziell FireDAC hat da schöne Überladungen, so dass man auch mit ganz wenig Code auskommt.
Delphi-Quellcode:
Query.ExecSQL('INSERT INTO Tabelle(Feld1, Feld2, Feld3) VALUES(:Wert1, :Wert2, :Wert3)', [1, 2, 3], [ftInteger, ftInteger, ftInteger]);
|
AW: Parameter unter Firedac
Hi zusammen
Vielen Dank für eure aufschlussreichen Antworten! Zitat:
Delphi-Quellcode:
nichts gefunden habe...
C:\Program Files (x86)\Embarcadero\Studio\16.0\source\data\firedac\stan\param
@DeddyH: Zitat:
Und wenn ich mehrere Zeilen draus mache, gehts übersichtlicher wirklich nicht mehr, ist aber immer noch viel kleiner:
Delphi-Quellcode:
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.
Query.ExecSQL('INSERT INTO Tabelle(Feld1, Feld2, Feld3),'+
' VALUES(:Wert1, :Wert2, :Wert3)', [1, 2, 3], [ftInteger, ftInteger, ftInteger]); Zitat:
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 |
AW: Parameter unter Firedac
Zitat:
statt
Delphi-Quellcode:
ist natürlich
[1, 2, 3]
Delphi-Quellcode:
gemeint.
[kategorien_tabelle_Kath_ID, BildDescribeTabelle_BilddesribeID, BildDescribeTabelle_Bildtabelle_idBild]
Zitat:
Delphi-Quellcode:
Gut, FireDAC wird bei falschen Typen nicht meckern können, aber spätestens das DBMS wird es dann tun.
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); |
AW: Parameter unter Firedac
Aus der Hilfe:
Zitat:
|
AW: Parameter unter Firedac
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 ![]() Zitat:
Delphi-Quellcode:
würde, wenn ich das jetzt nicht gründlich missverstanden habe:
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);
Delphi-Quellcode:
Da wird zwar die Variable übergeben. Aber allein aus diesen Zeilen geht nicht hervor, ob die auch wirklich parametrisiert werden.
SQLString := 'Insert Into Bildtabelle(Thumbnail) Values (:LThumbMemory)';
FDQueryMain.SQL.Text := SQLString; FDQueryMain.ExecSQL(false); Gruss Delbor |
AW: Parameter unter Firedac
Es bedeutet ganz einfach, dass FireDAC nach Zuweisen des SQL-Strings nach Parametern sucht, welche als
Delphi-Quellcode:
deklariert sind und dann macht FireDAC das Params.CreateParam, für die gefundenen Parameter (nur halt Typlos, da es den DataTyp ja nicht kennt)
:ParamName
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); |
AW: Parameter unter Firedac
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 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