Entwickler-Ecke

Datenbanken - TQuery.Params Eigenschaft verstehe ich nicht


Jakob Schöttl - Di 25.03.08 15:13
Titel: TQuery.Params Eigenschaft verstehe ich nicht
Hallo,

Ich glaub ich stell mich grad ein bisschen dumm.

Es geht um die Eigenschaft Params von TQuery.

  1. Stimmt es, dass ich die Parameter in der Eigenschaft SQL dann einfach verwenden kann - dass also der Name des Parameters dann durch den entsprechenden Wert ersetzt wird?
  2. Wie mache ich zur Laufzeit einen neuen Parameter? Geht das auch wenn TQuery.Active False ist?


Danke schon mal


mkinzler - Di 25.03.08 15:19

Am Besten .ParamCheck auf True stellen, dann werden Parameter automatisch anhand der Abfrage erzeugt:

SQL-Anweisung
1:
select <Feldliste> from <Tabelle> where <Feld1> = :Parameter1;                    

erzeugt automatisch den Parameter Parameter1
auf den du dann z.B. per
query.ParamByName('Parameter1').Value zugreifen kannst.


Jakob Schöttl - Di 25.03.08 15:41

Ah, Vielen Dank!
Das wars eigentlich auch schon.


Jakob Schöttl - Mi 26.03.08 11:58

Jetzt hab ich doch noch eine Frage.

Mein Parameter muss für die Abfrage den richtigen Typ haben (sonst gibt es eine Exception).

Wie lege ich fest, dass der Parameter Integer sein soll?


mkinzler - Mi 26.03.08 12:37

Sollte eigentlich automatisch anhand des Feldtype der Datenbank erkannt werden. Sonst


Delphi-Quelltext
1:
Query.ParamByName('<Name>').asInteger := ...                    


Jakob Schöttl - Mi 26.03.08 15:03

ParamCheck ist True;

Der Parameter heißt SchiessenID

den Parameter habe ich auf diese Weise erstellt:

Delphi-Quelltext
1:
Query.ParamByName('SchiessenID').AsInteger := Value;                    

in Query.SQL steht:

SQL-Anweisung
1:
2:
3:
4:
SELECT Schuetzen.Name, Vereine.Vereinsname, Schuetzen.Geburtsdatum
FROM Schuetzen, zSchuetzenVereine, Vereine
WHERE (Schuetzen.ID = zSchuetzenVereine.SchuetzenID) AND (zSchuetzenVereine.VereineID = Vereine.ID) AND (zSchuetzenVereine.VereineID IN ( SELECT VereineID FROM zSchiessenVereine WHERE (SchiessenID = :SchiessenID) ))
ORDER BY Name, Verein


mkinzler - Mi 26.03.08 15:29

Der Parameter wird durch setzen der Abfrage erzeugt! Zuweisung ist erst später möglich


Jakob Schöttl - Mi 26.03.08 19:17

user profile iconmkinzler hat folgendes geschrieben:
Der Parameter wird durch setzen der Abfrage erzeugt! Zuweisung ist erst später möglich

oh, aber er muss doch schon vor der Abfrage definiert sein!


alzaimar - Mi 26.03.08 20:45

Nein.

Delphi-Quelltext
1:
2:
3:
Query.SQL.Text :'select * from Foo where Field = :Bar';   // 1.
Query.Params.ParamByName('Bar').AsInteger := 123;         // 2.
Query.Active := True;                                     // 3.


Jakob Schöttl - Mi 26.03.08 22:02


Delphi-Quelltext
1:
2:
3:
Query.SQL.Text :'select * from Foo where Field = :Bar';   // 1. ist bei mir schon zur Entwurfszeit gesetzt
Query.Params.ParamByName('Bar').AsInteger := 123;         // 2. mach ich zur Laufzeit am Anfang
Query.Active := True;                                     // 3. mache auch, davor ist Query.Active = False


am besten ich probier das ganze nochmal in einem kleinen Testprojekt aus, mal schaun ob ich dann draufkomme...


alzaimar - Mi 26.03.08 22:16

Vielleicht hilft es, den Datentypen des Parameters auch explizit zur Entwurfszeit zu setzen. Ich jedenfalls hab damit keine Probleme.


Jakob Schöttl - Do 27.03.08 13:36

user profile iconalzaimar hat folgendes geschrieben:
Vielleicht hilft es, den Datentypen des Parameters auch explizit zur Entwurfszeit zu setzen


das wäre wahrscheinlich das Beste, aber das geht irgendwie nicht:
in dem Editor für Params sind alle Schaltflächen grau, egal ob die Datenmenge geschlossen oder geöffnet ist...


mkinzler - Do 27.03.08 13:41

Hast du die Abfrage auch vorher zugewiesen?


Jakob Schöttl - Do 27.03.08 13:48

ja, die eigenschaft SQL habe ich auch schon zur entwurfszeit festgelegt.


Erichgue - Do 27.03.08 13:57

user profile iconJakob Schöttl hat folgendes geschrieben:
ja, die eigenschaft SQL habe ich auch schon zur entwurfszeit festgelegt.


ParamCheck auf True?

Erich


Jakob Schöttl - Do 27.03.08 14:06

ah! jetzt seh ichs! Der Parameter entsteht automatisch, wenn ich die Eigenschaft SQL setze. Dann kann ich dem Parameter als DataType ftInteger zuweisen!

Ich hab erst gedacht, der Parameter wird erst bei der Abfrage selbst (also Open) erzeugt.

Dann schau ich mal weiter...

Vielen Dank für eure Bemühungen!