Delphi - Save DateTime Null to DB (ADO / MySQL)
Domanda
Ho un modulo Delphi con alcuni controlli DB su di esso.
Per rappresentare una data uso TJvDBDatePickerEdit
(da JCL), che ha una bella proprietà
ShowCheckBox := True;
per consentire all'utente di inserire che nessuna data è nota (DBNull).
Verifico che l'annullamento di DatePicker funzioni come previsto da:
procedure Tframe.adoQueryBeforePost(DataSet: TDataSet);
begin
if (qryAuftraege.FieldByName('MyDateField').IsNull) then
begin
ShowMessage('IsNull!');
end;
end;
Viene visualizzata la finestra di messaggio. Quindi il campo che il componente ADO dovrebbe scrivere è di tipo varNull.
Ora c'è questa pipeline:
TADOQuery -> TADOConnection -> MS OLE DB Provider for ODBC Drivers -> MySQL ODBC 5.1 Driver
E il driver ODBC MySQL ora mostra nel suo registro:
UPDATE `db`.`table` SET `MyDateField`=_latin1'0004-00-00' WHERE `ID`=5 AND `MyDateField`=_latin1'2009-06-17';
Bene, la data è memorizzata come '0004-00-00'
(che MySQL sembra salvare in quel modo).
Ora quando si interroga la voce, viene riconosciuta Null da Delphi, ma quando verrà aggiornata la prossima volta, chiamando:
UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
ovviamente fallisce, perché MyDateField NON è NULL (almeno nel database MySQL).
Da dove viene questa stringa '0004-00-00'
? Se è un bug da qualche parte, dove potrei eventualmente intercettarlo?
So già che ci sono componenti da acquistare che forniscono connessioni MySQL dirette che (presumo) non mostrano questo comportamento.
Soluzione
Assicurati di controllare le tue opzioni MySQL come discusso qui ...
Quindi, proverei con un diverso set di componenti di connessione poiché lo stack (driver ADO + ODBC 5.1) potrebbe qui il problema.
Hai provato con un altro driver ODBC?
O con DBX ...
Altri suggerimenti
Per salvare una data / ora nulla nel record del database, basta chiamare
qryAuftraege.FieldByName('MyDateField').clear;
Non conosco le implicazioni di farlo, ma l'ho sempre usato
qryAuftraege.FieldByName('MyDateField').AsString:='';