AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DB param explizit auf 0 setzen
Thema durchsuchen
Ansicht
Themen-Optionen

DB param explizit auf 0 setzen

Offene Frage von "mannewolff"
Ein Thema von mannewolff · begonnen am 16. Mai 2010 · letzter Beitrag vom 19. Mai 2010
Antwort Antwort
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#1

DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 11:56
Datenbank: MySql • Version: 5 • Zugriff über: dbExpress
Moin.

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

Die Anweisung

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 ?
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#2

Re: DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 12:01
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
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#3

Re: DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 12:11
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.298 Beiträge
 
Delphi 12 Athens
 
#4

Re: DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 12:23
Hallo...

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

  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#5

Re: DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 12:25
Zitat von haentschman:
Hallo...

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

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).
  Mit Zitat antworten Zitat
pixfreak

Registriert seit: 6. Jul 2007
112 Beiträge
 
Delphi XE3 Professional
 
#6

Re: DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 13:32
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:

  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...

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



VG Pixfreak
  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#7

Re: DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 13:48
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.,
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: DB param explizit auf 0 setzen

  Alt 17. Mai 2010, 07:33
Hallo,

versuch es bitte mal mitquery.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.
  Mit Zitat antworten Zitat
mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#9

Re: DB param explizit auf 0 setzen

  Alt 19. Mai 2010, 07:51
Zitat von nahpets:
Hallo,

versuch es bitte mal mitquery.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 !
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: DB param explizit auf 0 setzen

  Alt 19. Mai 2010, 09:28
Versuch's mal so:
query.Params[paramInt].value := NULL; Auch hier die Unit Variants einbinden.

Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19: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