Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DB param explizit auf 0 setzen (https://www.delphipraxis.net/151396-db-param-explizit-auf-0-setzen.html)

mannewolff 16. Mai 2010 12:56

Datenbank: MySql • Version: 5 • Zugriff über: dbExpress

DB param explizit auf 0 setzen
 
Moin.

Ich möchte gern einen Parameter explizit auf nil setzen.

Die Anweisung

Delphi-Quellcode:
query.Params[paramInt] := nil
scheitert (nil kann nicht zu TParam zugewiesen werden).

Den Parameter nicht zuweisen scheitert, es gibt die Fehlermeldung "Fehlender Wert für Parameter xy aufgetreten".

Ich habe ein Constraint von einer Tabelle zu einer anderen, der auch Null-Werte enthalten darf. Nur wenn ich den Null-Wert nicht setzen kann, dann hilft es mir nicht. Habe als Workaround den Constraint rausgenommen, das kann aber nicht die Lösung sein.

Da die SQL's generisch in einer Superklasse hergestellt werden hilft auch nicht der Tip die Werte erst gar nicht als parameter zu deklarieren.

Also die Frage: Kann ich einen definierten Parameter irgendwie NULL zuweisen ?

TBx 16. Mai 2010 13:01

Re: DB param explizit auf 0 setzen
 
Wenn Du uns jetzt noch verraten würdest, von welchem Datentyp query und Params sind, vermutlich.

So ins Blaue getippt: query.params["PARAMETER"].SetNull oder query.params["PARAMETER"].Clear

mannewolff 16. Mai 2010 13:11

Re: DB param explizit auf 0 setzen
 
query ist vom Typ TSQLQuery.
params ist vom Typ TParams.

- .SetNull gibt es leider nicht als Methode.
- .Clear schmeisst die gleiche Fehlermeldung (Fehlender Wert für Parameter xy aufgetreten). In der Online Doku steht zwar, dass man mit Clear den Wert NULL zuweisen kann und dann noch Bound auf true sezten muss. Aber auch das hat keinen Effekt.

Gruß
Manne

haentschman 16. Mai 2010 13:23

Re: DB param explizit auf 0 setzen
 
Hallo... :hi:

wenn ich das richtig verstehe willst du beim Einfügen eines DS den Feldinhalt NULL speichern. Warum läßt du dann im SQL das Feld nicht einfach weg ? Dann ist der Feldinhalt NULL

:gruebel:

mannewolff 16. Mai 2010 13:25

Re: DB param explizit auf 0 setzen
 
Zitat:

Zitat von haentschman
Hallo... :hi:

wenn ich das richtig verstehe willst du beim Einfügen eines DS den Feldinhalt NULL speichern. Warum läßt du dann im SQL das Feld nicht einfach weg ? Dann ist der Feldinhalt NULL

:gruebel:

Wie schon gesagt: Der QueryString wird generisch von einer Superklasse erzeugt. Falls es nicht anders geht, muss ich da Hand anlegen. Ich würde eine andere Möglichkeit vorziehen, wenn es sie denn gibt ;-). Mein gesamter Datenbankzugriff ist generiert und ich wollte es vermeiden die Metadaten des Generators anzufassen (never change a running system).

pixfreak 16. Mai 2010 14:32

Re: DB param explizit auf 0 setzen
 
Hi,

entweder ich übersehe hier etwas oder ich hab noch nicht ganz den Durchblick. Helfen würde vielleicht, wie denn dein SQL-String zu deinem Problem aussieht.

Ich vermute mal, dass Du ein Feld in einer Datenzeile auf null setzen willst. Ein Parameter ist bei mir aber immer in der Abfrage, sprich z.B. in der where Klausel. Daher würde ich es so machen:

Delphi-Quellcode:
  query.Fields[paramInt].Clear
Das setzt den Datenwert worauf der Cursor und paramInt gerade zeigen auf NULL. param[index].clear löscht (setzt ihn auf null) nur den Parameter in der Abfrage aber nicht den Datenwert. Und abfragen tue ich ja nicht mit xyz=null... :wink:

(Ich hoffe ich liege auf die schnelle hier richtig, tippe von unterwegs... :stupid: )



VG Pixfreak

mannewolff 16. Mai 2010 14:48

Re: DB param explizit auf 0 setzen
 
So würde ich es auch machen, funktioniert aber nicht. Zur Laufzeit gibt es eben genau die Fehlermeldung, dass der Parameter nicht gesetzt wurde. Mein SQL-String sieht wie folgt aus:

Delphi-Quellcode:
procedure TPersistenz.createInsertQuery();
var
  stringList : TStringList;
  i         : Integer;
  sql       : String;
begin
   stringList := getMETA(true);
   sql := 'INSERT into ' + getTableName() + ' (';

   // Alle Attribute der Fachklasse
   for i := 0 to stringList.Count -1 do
   begin
      sql := sql + stringList.Strings[i] + ', ';
   end;

   // Zusätzlich die Defaultattribute
   sql := sql + 'id, active, createuser, createdate, modifyuser, modifydate, uniqueString, version) ';
   sql := sql + 'VALUES (';

   // Alle Parameterwerte der Fachklasse
   for i := 0 to stringList.Count -1 do
   begin
      sql := sql + ':' + stringList.Strings[i] + ', ';
   end;

   // Zusätzlich die Defaultparameter
   sql := sql + ':id, :active, :createuser, :createdate, :modifyuser, :modifydate, :uniqueString, :version)';

   query.SQL.Add(sql);
end;
Der Code ist in der Superklasse TPersistenz und gilt für alle Objekte, die persistiert werden können. getMeta() wird dann von den Fachklassen überschrieben und liefert die Liste der Attribute. Die Fachklassen selbst werden generiert, das heißt getMeta() liefert immer (!) alle Attribute der Klasse.

Ich habe jetzt den Generator angepasst, dass getMeta() unter bestimmten Umständen die Null-ForeignKeys nicht liefert. Ich zeichne diese ForeignKeys mit NFK_ aus (im Gegensatz zu FK_ Keys die nicht null sein dürfen) und mein Generatortemplate sieht dann so aus:

Delphi-Quellcode:
(*********************************************************************
 Gibt die META-Daten für diese Klasse zurück.
 *********************************************************************)
function @OBJNAME.getMETA(modifyList : boolean = false) : TStringList;
begin
  ...
    @foreach @Attribute @do
      @if(copy @Attribute.Identifier 1 3 == NFK)
      if (@Attribute.Identifier <> 0) then
      @endif
      stringList.Add('@Attribute.Identifier');
    @EndForEach
  ..
end;
Es wird also in den Fall modifyList ein Attribut nur der Stringlist hinzugefügt wenn es nicht mit NFK anfängt oder wenn es eub NFK Attribut ist und es nicht 0 ist.,

nahpets 17. Mai 2010 08:33

Re: DB param explizit auf 0 setzen
 
Hallo,

versuch es bitte mal mit
Delphi-Quellcode:
query.Params[paramInt] := EmptyParam;
Dazu musst Du die Unit Variants einbinden. EmptyParam ist der Inhalt für einen leeren Parameter, der Parameter selbst muss ja erhalten bleiben, was bei der Zuweisung von nil, allem Anschein nach, nicht der Fall ist.

mannewolff 19. Mai 2010 08:51

Re: DB param explizit auf 0 setzen
 
Zitat:

Zitat von nahpets
Hallo,

versuch es bitte mal mit
Delphi-Quellcode:
query.Params[paramInt] := EmptyParam;
Dazu musst Du die Unit Variants einbinden. EmptyParam ist der Inhalt für einen leeren Parameter, der Parameter selbst muss ja erhalten bleiben, was bei der Zuweisung von nil, allem Anschein nach, nicht der Fall ist.

Geht leider auch nicht. Die Fehlermeldung heißt jetzt: Inkompatible Typen: "TParam" und "OleVariant". Ich habe es jetzt durch obigen Workaround gelöst. Interessanterweie geht meiner erste Lösung (Parameter nicht setzen) und Lazarus (FPC) reibungslos !

mikhal 19. Mai 2010 10:28

Re: DB param explizit auf 0 setzen
 
Versuch's mal so:
Delphi-Quellcode:
query.Params[paramInt].value := NULL;
Auch hier die Unit Variants einbinden.

Grüße
Mikhal


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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 by Thomas Breitkreuz