![]() |
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:
scheitert (nil kann nicht zu TParam zugewiesen werden).
query.Params[paramInt] := nil
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 ? |
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 |
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 |
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: |
Re: DB param explizit auf 0 setzen
Zitat:
|
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:
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:
query.Fields[paramInt].Clear
(Ich hoffe ich liege auf die schnelle hier richtig, tippe von unterwegs... :stupid: ) VG Pixfreak |
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:
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.
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; 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:
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.,
(*********************************************************************
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; |
Re: DB param explizit auf 0 setzen
Hallo,
versuch es bitte mal mit
Delphi-Quellcode:
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.
query.Params[paramInt] := EmptyParam;
|
Re: DB param explizit auf 0 setzen
Zitat:
|
Re: DB param explizit auf 0 setzen
Versuch's mal so:
Delphi-Quellcode:
Auch hier die Unit Variants einbinden.
query.Params[paramInt].value := NULL;
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