![]() |
Datenbank: MS SQL Server • Version: 2008 • Zugriff über: FireDAC
FireDAC: Verhalten von Params
Moin,
ich habe ein Verständnisproblem mit der Art und Weise, wie eine FDQuery die Übergabe von Parametern abwickelt. Hintergrund ist im Augenblick eine Druckroutine, die von einer Stammverwaltung als auch aus einem Beleg aufgerufen werden kann. Probleme treten nun auf, wenn man den Druck nacheinander über Kreuz aufruft. Dann ist der Parameter, der für die Eingrenzung des Stammdatensatzes benötigt wird, nämlich schon gefüllt und ein neuer Wert wird ignoriert. Bevor ich den Druck anstoße, schließe ich jedoch die Abfrage und setze den kompletten Abfrageinhalt mit CLEAR zurück. Anschließend wird die Abfrage neu aufgebaut. Parameter übergebe ich mit Parambyname, sofern der Wert nicht aus einer referenzierenden Datenquelle geholt werden soll. In dem Fall reicht die Definition eines Params mit ":" im SQL-Statement. Jetzt wundere ich mich aber über die Verwaltung der Parameterwerte, denn es macht einen Unterschied, ob ich den Wert über Parambyname übergebe oder im SQL-Statement als Wert mit versenke. Normalerweise würde ich es so formulieren:
Delphi-Quellcode:
Dabei wird ParamRef als Wert an die Parameter an die Prozedur übergeben und der Wert entspricht auch dem gewünschten Datensatz.
with Druckmodul.QrMaschine Do
begin Close; SQL.Clear; SQL.Add('SELECT * FROM MASCHINEN M'); SQL.Add('WHERE (M.MaschinenNr = :Maschinennr)'); Parambyname('Maschinennr').AsString := ParamRef; Open; end; Wenn ich aber vorab z.B. Maschine 1234 über die Stammdatenverwaltung aufgerufen habe und anschließend aus dem Beleg Maschine 3676 ausgegeben haben möchte, bekomme ich 1234 ausgegeben, obwohl ParamRef 3676 als Wert enthält. Es ist etwas anderes, wenn ich den Wert so in das Statement einbeziehe:
Delphi-Quellcode:
Ich weiß wirklich nicht, was ich davon halten soll. Jeder hat seinen Programmierstil irgendwann gefunden, um mit wenig Aufwand sein Ziel erreichen zu können und trotzdem einen lesbaren Quellcode zu haben. Mein Geschmack ist das Einflechten des Wertes in das SQL-Statement nicht. Vor allem muss auch jedes Mal bei einem String ein QuotedStr oder AnsiQuotedStr um den Ausdruck gesetzt werden.
with Druckmodul.QrMaschine Do
begin Close; SQL.Clear; SQL.Add('SELECT * FROM MASCHINEN M'); SQL.Add('WHERE (M.MaschinenNr = ' + QuotedStr(ParamRef) + ')'); Open; end; Kann mir einer verraten, warum das so ist und wie man das Problem lösen kann? Viele Grüße Ingo |
AW: FireDAC: Verhalten von Params
Delphi-Quellcode:
vielleicht hilft ein Prepare.
with Druckmodul.QrMaschine Do
begin Close; SQL.Clear; SQL.Add('SELECT * FROM MASCHINEN M'); SQL.Add('WHERE (M.MaschinenNr = :Maschinennr)'); Parambyname('Maschinennr').AsString := ParamRef; Prepare; Open; end; Grüße Klaus |
AW: FireDAC: Verhalten von Params
Zitat:
Wenn man mit dem Problem konfrontiert wird, versteht man aber die Welt irgendwie nicht. Viele Grüße Ingo |
AW: FireDAC: Verhalten von Params
Änderungen sind vor dem Abschließen einer Transaktion ausserhalb dieser nicht sichtbar (wenn man keinen "dirty-read" verwendet).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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