Entwickler-Ecke
Datenbanken - NULL-Value über TIBDataset in ein DateField in die DB
wmolzahn - Mo 08.03.10 14:31
Titel: NULL-Value über TIBDataset in ein DateField in die DB
Ich habe ein Riesenproblem:
Ich steige um von Delphi 7 auf 2010 und befürchte, dass im Zusammenhang mit den neuen TIB-Komponenten das Standardverhalten bei der Übergabe von NULL an (Firebird 1.5) Date-Felder geändert wurde.
Bisher habe ich NULL-Values an ein Datefield so übergeben:
Delphi-Quelltext
1: 2:
| Dataset1.FieldByName('DateField1').AsString := '' bzw. Dataset1.FieldByName('DateField1').clear |
Damit kam (nach Post und Commit) in der DB immer schön ein NULL-Wert an.
Jetzt - unter Delphi 2010 - führen beide Varianten dazu, dass der letzte bzw. alte Wert wiederhergestellt wird. Offensichtlich wird ein Leerstring als inkorrekt angesehen und deshalb wird der letzte korrekte Wert restauriert.
Dies ist ein großes Problem, u.a. führen viele fertige SQL-Queries zu falschen Ergebnissen, weil ich mit '... where Datefield1 is null' arbeite etc.
Weiß jemand zu diesem Thema Rat und kann helfen? Ich wäre sehr dankbar. :(
Moderiert von
Narses: Color- durch Delphi-Tags ersetzt
Xentar - Mo 08.03.10 16:54
Hab zwar nur D2007, kann ich aber nicht nachvollziehen.
Mehr Code wäre nicht schlecht.
wmolzahn - Di 09.03.10 10:18
Xentar hat folgendes geschrieben : |
Hab zwar nur D2007, kann ich aber nicht nachvollziehen.
Mehr Code wäre nicht schlecht. |
Das Problem habe ich auch erst mit Delphi 2010. Ich bin von Delphi 7 umgestiegen. Vorher war alles ok. Derselbe Code läuft jetzt nicht mehr. Mein derzeitiger Wissensstand ist wie folgt:
Ausgangssituation:
Datensatz aus DB gelesen, DateField hat einen korrekten Inhalt '01.01.2010'
Alternative Maßnahmen, um NULL in das dateField zu bekommen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| TIBDataset1.FieldByName('DateField1').clear; TIBDataset1.FieldByName('DateField1').AsString := ''; TIBDataset1.FieldByName('DateField1').Value := Null; TIBDataset1.FieldByName('DateField1').Value := Unassigned; TIBDataset1.FieldByName('DateField1').AsVariant := Unassigned; |
Egal was ich tue, ich schaffe es nicht den gewünschten NULL-Wert in das DateField zuzuweisen. Interessanterweise ist aber ein NULL-Wert drin, wenn ich den Datensatz per INSERT frisch angelegt habe - und er bleibt solange drin, bis ich ihn erstmalig mit einem gültigen Datum überschreibe. Ab dann heißt es: Nie wieder NULL.
Erstaunlicherweise funktioniert das Ganze aber noch (wie unter D7) mit Integer und String. Wenn ich also Attributen diesen Typs z.B. Leerstrings zuweise und den Inhalt dann in der DB abspeichere, finde ich dort auch den erwünschten NULL-Wert wieder.
Moderiert von
Narses: Delphi-Tags hinzugefügt
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
ssb-blume - Di 09.03.10 12:39
Hallo
'Datafield' ist in der DB als Datum-Typ deklariert. Ein Datum muss existieren, es kann höchstens auf den Anfang (1890...) gesetzt werden.
Wandle den Typ des Feldes in 'String' um, dann geht es einwandfrei. Außerdem lässt sich dann auch schön nach Tag, Monat oder Jahr selektieren (mit Like..)
Hansi
Xentar - Di 09.03.10 12:53
Mit meiner Frage nach dem "mehr Quellcode" wollte ich eigentlich darauf hinaus, ob du mit DataSet.Edit bzw. DataSet.Post arbeitest.
Was passiert, wenn du den Wert per SQL Befehl auf NULL setzt?
Update Tabelle SET DateField = NULL where .....
ssb-blume hat folgendes geschrieben : |
Hallo
'Datafield' ist in der DB als Datum-Typ deklariert. Ein Datum muss existieren, es kann höchstens auf den Anfang (1890...) gesetzt werden. |
Soweit ich weiß kann man unter Firebird auch datumswerte auf NULL setzen. Voraussetzung ist natürlich, dass das Feld nicht die Eigenschaft "not null" hat, und kein Standardwert vorgegeben ist.
ssb-blume hat folgendes geschrieben : |
Wandle den Typ des Feldes in 'String' um, dann geht es einwandfrei. Außerdem lässt sich dann auch schön nach Tag, Monat oder Jahr selektieren (mit Like..)
Hansi |
Sorry, aber dieser "Tipp" ist Quatsch.
Sortier doch mal bite nach Datum..
order by Jahr, Monat, Tag, oder wie?
Und wenn man nicht aufpasst, trägt man den 2.2. ein, und schon wird er nach dem 10.2. angezeigt, juhu.
Ralf1504 - Do 08.04.10 13:57
Ich habe das gleiche Problem.
TDateField.Clear; ergibt unter Delphi2010(Update 4; 5) nicht TDateField.IsNull = true sondern 30.12.1899.
Bin gerade dabei ein Projekt von Delphi2007 auf Delphi2010 umzustellen.
Dieses ist dabei derzeit mein größten (aber nicht einziges) Problem, welches noch auf eine Lösung wartet.
Unter Delphi2007 läuft alles richtig.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!