Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DB Parameter (https://www.delphipraxis.net/138798-db-parameter.html)

youuu 17. Aug 2009 20:16

Datenbank: MySQL • Zugriff über: Devarts

DB Parameter
 
Hi,

Gibt es eine Möglichkeit die DB Parameter:

Delphi-Quellcode:
QueryRead.Params.ParamValues['test']:= Infos.test;
.
.
.
.
.
.
.
.
Einmalig für alle Querys zu definieren oder muss man sie unter jeden Query erneut schreiben?

Jens Hartmann 17. Aug 2009 21:58

Re: DB Parameter
 
Hallo,

wenn du in der Query, deinen SQL-String zuweisen tust, und dort die Parameter angibts (Was Du ja musst), werden die Parameter automatisch gesetzt. (Entwicklungszeit),

Da ich aber bis jetzt die ganze Sache so verstanden habe, jede Abfrage etc. eine eigene Query, ist es ja so kein Problem.

Gruß Jens

sx2008 18. Aug 2009 01:26

Re: DB Parameter
 
Du kannst natürlich eine private Methode schreiben:
Delphi-Quellcode:
procedure TForm1.SetzeAlleParameter(qry:TMySQLQuery; Infos:TIrgendEinRecordOderKlasse);
begin
  Assert(Assigned(qry)); // Sicherheitsabfrage
  qry.Params.ParamValues['test']:= Infos.test;
  ..
end;
Bei vielen Queries und Parameter kann das viel Schreibarbeit sparen.

hoika 18. Aug 2009 06:47

Re: DB Parameter
 
Hallo,

und die relevanten Queries kommen noch in eine TList (z.B.),
dann geht das ganze per Schleife.


Heiko

youuu 18. Aug 2009 17:50

Re: DB Parameter
 
Allerdings tritt da ein Problem bei mir auf.

Wenn ich die Procedure benutze

Bsp:
Delphi-Quellcode:
public
  Procedure ParamInfo (qry: TMyQuery);
Delphi-Quellcode:
Procedure TFormMain.ParamInfo (qry: TMyQuery);
Begin
  Assert(assigned(qry)); //Sicherheitsabfrage
  qry.Params.ParamValues['histC']:= Infos.Hist;
End;
Allerdings nun in einer anderen Unit verwenden möchte per

Delphi-Quellcode:
FormMain.ParamInfo(QueryInsert);
aufruf.
Funktioniert es nicht da mir Delphi sagt QueryInsert undeklarierter Bezeichner.

DeddyH 18. Aug 2009 17:54

Re: DB Parameter
 
Hast Du denn auch in der aufrufenden Unit eine Variable QueryInsert vom Typ TMyQuery instanziert?

youuu 18. Aug 2009 18:18

Re: DB Parameter
 
Ebend nicht, da das lediglich eine Unit ist ohne eine Form, daher kann ich die Komponente nicht auf die Form.

DeddyH 18. Aug 2009 18:27

Re: DB Parameter
 
Wieso Komponente? Ich habe von der Instanz QueryInsert des Typs TMyQuery gesprochen. Auf Deutsch:
Delphi-Quellcode:
var QueryInsert: TMyQuery;
...
  QueryInsert := TMyQuery.Create(<Parameter>);
Diese Instanz musst Du dann übergeben.

youuu 18. Aug 2009 18:46

Re: DB Parameter
 
Danke das wusste ich gar nicht.
Funktionietr nun auch alles, allerdings eine Frage dazu.

Wenn ich nun mehre Parameter angebe, allerdings niht alle verwenden muss in dem Query, dann spuckt Delphi einen Fehler aus über die nicht vrweneten Parameter. Ist das normal bzw kann man dies umgehen ohne die Parameter zu löschen? Da sie in eine Procedure aus gelagert wurden.

Ist jetzt nicht sehr wichtig, aber wäre interessant zu wiessen.

DeddyH 18. Aug 2009 18:53

Re: DB Parameter
 
Das kann ich aus dem Hut nicht beantworten, da ich alle Parameter, die ich definiere, auch verwende. Evtl. könnte man die Werte ja als array of const übergeben, um flexibel zu bleiben (sofern die Procedure für mehrere Queries mit unterschiedlicher Parameteranzahl verwendet wird).

mkinzler 18. Aug 2009 18:54

Re: DB Parameter
 
Kennt diese Klasse ein ParamCheck?

DeddyH 18. Aug 2009 19:05

Re: DB Parameter
 
Zur Not Bernhard (Geyer) fragen, AFAIK nutzt der genau diese Komponenten auch schon länger.

mkinzler 18. Aug 2009 19:23

Re: DB Parameter
 
Ich benutze die InterBase/FireBird Varianten. Aber ich setze auch immer nur die benötigten Parameter

youuu 18. Aug 2009 20:00

Re: DB Parameter
 
Zitat:

Zitat von mkinzler
Kennt diese Klasse ein ParamCheck?

Das weiß ich nicht

mkinzler 18. Aug 2009 21:23

Re: DB Parameter
 
Dann könntest du nachschauen. Ich würde aber das Pferd andersrum aufzäumen: Geh durch die Parameter der Abfrage und bestückre diese dann mit den Werten aus der Liste/dem Array.

hoika 18. Aug 2009 21:24

Re: DB Parameter
 
Hallo,

Zitat:

Wenn ich nun mehre Parameter angebe, allerdings niht alle verwenden muss in dem Query, dann spuckt Delphi einen Fehler aus über die nicht vrweneten Parameter. Ist das normal bzw kann man dies umgehen ohne die Parameter zu löschen? Da sie in eine Procedure aus gelagert wurden.
Najaaaaa ;)

Nicht angegebene Parameter müssen also solche definiert werden.
(Bounds, IsNull)

Zur Not hilft es, alle Parameter als Null zu vordeklarieren,
und dann die richtigen nochmal zu setzen.

Ist aber unsauber.
Die aufrufende Methode sollte doch wissen,
was NULL und was nicht NULL ist und das entsprechend so setzen.


Heiko

mkinzler 18. Aug 2009 21:27

Re: DB Parameter
 
Hallo Heiko,
ich habe sein Problem anders verstanden. Er hat Liste von (Parameter-)Werte, welche in verschiedenen Abfragen nur zum Teil vorkommen. Versucht er nun einen nicht vorhandenen Parameter zu belegn kommt natürlich der Fehler.

sx2008 19. Aug 2009 00:17

Re: DB Parameter
 
Im Prinzip so:
Delphi-Quellcode:
Procedure TFormMain.ParamInfo(qry: TMyQuery);
Begin
  Assert(assigned(qry)); //Sicherheitsabfrage
  qry.Params.ParamValues['histC']:= Infos.Hist;

  // hier wird angenommen, dass nicht alle Queries den Parameter "histDate" benötigen
  // mit FindParam() wird abgefragt, ob es den Parameter wirklich gibt
  if Assigned(qry.Params.FindParam('histDate')) then
    qry.Params.ParamValues['histDate']:= Infos.HistDate;
End;
Bin nicht sicher, ob die Funktion wirklich FindParam() heisst;
es gibt aber auf jeden Fall eine Funktion mit der es möglich ist einen best. Parameter abzufragen.
Ggf. Online Hilfe befragen.

mkinzler 19. Aug 2009 05:37

Re: DB Parameter
 
Oder eben anderesherum, nicht schauen, ob es den Parameter zum Wert gibt, sondern die paramter durchgehen und den entsprechenden Wert holen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 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