Ich habe ein Delphi-Formular mit einigen DB-Steuerelementen auf sie.
Um ein Datum darzustellen, verwende ich die TJvDBDatePickerEdit
(aus JCL), die eine schöne Eigenschaft hat
ShowCheckBox := True;
damit der Benutzer eingeben kann, dass kein Datum bekannt ist (DBNull).
Ich überprüfe, dass das Nullsetzen des DatePicker wie erwartet funktioniert:
procedure Tframe.adoQueryBeforePost(DataSet: TDataSet);
begin
if (qryAuftraege.FieldByName('MyDateField').IsNull) then
begin
ShowMessage('IsNull!');
end;
end;
Das Nachrichtenfeld zeigt an. Das Feld, das die ADO-Komponente schreiben soll, ist also vom Typ varNull.
Jetzt gibt es diese Pipeline:
TADOQuery -> TADOConnection -> MS OLE DB Provider for ODBC Drivers -> MySQL ODBC 5.1 Driver
Und der MySQL ODBC-Treiber wird jetzt in seinem Protokoll angezeigt:
UPDATE `db`.`table` SET `MyDateField`=_latin1'0004-00-00' WHERE `ID`=5 AND `MyDateField`=_latin1'2009-06-17';
Nun, das Datum wird gespeichert als '0004-00-00'
(die MySQL so zu speichern scheint). Nun wird der Eintrag bei der Abfrage von Delphi als Null erkannt, aber wenn er das nächste Mal aktualisiert werden soll, wird er aufgerufen:
UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
schlägt natürlich fehl, weil MyDateField NICHT NULL ist (zumindest in der MySQL DB).
Wo wird diese Zeichenfolge '0004-00-00'
kommen? Wenn es irgendwo ein Fehler ist, wo könnte ich ihn möglicherweise abfangen?
Ich weiß bereits, dass es Komponenten zu kaufen gibt, die direkte MySQL-Verbindungen bereitstellen, die (so nehme ich an) dieses Verhalten nicht zeigen.