У меня есть форма Delphi с некоторыми элементами управления DB.Delphi - Save DateTime Null to DB (ADO/MySQL)
Для представления даты я использую TJvDBDatePickerEdit
(от JCL), который имеет хорошее имущество
ShowCheckBox := True;
, чтобы позволить пользователю вводить, что дата не известен (DBNull).
Я подтверждаю, что обнуление DatePicker работает, как ожидалось:
procedure Tframe.adoQueryBeforePost(DataSet: TDataSet);
begin
if (qryAuftraege.FieldByName('MyDateField').IsNull) then
begin
ShowMessage('IsNull!');
end;
end;
в окне сообщения шоу. Поэтому поле, которое должен написать компонент ADO, имеет тип varNull.
Сейчас этот газопровод:
TADOQuery -> TADOConnection -> MS OLE DB Provider for ODBC Drivers -> MySQL ODBC 5.1 Driver
И драйвер MySQL ODBC теперь показывает в его журнале:
UPDATE `db`.`table` SET `MyDateField`=_latin1'0004-00-00' WHERE `ID`=5 AND `MyDateField`=_latin1'2009-06-17';
Ну, дата хранится в виде '0004-00-00'
(который, кажется, MySQL, чтобы сохранить как что). Теперь при запросе записи, то он распознается как Null на Delphi, но когда она обновляется в следующий раз, позвонив:
UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
конечно терпит неудачу, потому что MyDateField является NOT NULL (по крайней мере, в БД MySQL).
Откуда взялась эта строка '0004-00-00'
? Если это где-то ошибка, где я могу ее перехватить?
Я уже знаю, что есть компоненты для покупки, которые обеспечивают прямые подключения MySQL, которые (я предполагаю) не показывают этого поведения.
или ZEOSLIB (бесплатно), MyDAC (не бесплатно) для собственного доступа к MySQL. –
хотя я не пробовал, я думаю, вы правы в том, что проблема находится в стеке. Теперь я переключусь на Postgres (у которого есть более подходящая модель лицензирования), потому что я не привязан к MySQL. Вероятно, я также попробую Zeoslib. Благодарю. – Tarnschaf
Поскольку эти вопросы, похоже, привлекают внимание: переключение на Postgres с Zeoslib решило проблему. – Tarnschaf