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.

È stato utile?

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:='';
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top