У меня есть форма Delphi с некоторыми элементами управления БД.
Для представления даты я использую 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 сохраняет таким образом).
Теперь, когда запрашивает запись, она распознается Delphi как Null, но когда она будет обновлена в следующий раз, вызов:
UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
конечно, происходит сбой, потому что MyDateField НЕ NULL (по крайней мере, в БД MySQL).
Откуда взялась эта строка '0004-00-00'
? Если это где-то ошибка, где я могу ее перехватить?
Я уже знаю, что есть компоненты для покупки, которые обеспечивают прямые соединения MySQL, которые (я полагаю) не показывают такое поведение.