Delphi - Сохранить нулевое значение даты в БД (ADO / MySQL) - PullRequest
2 голосов
/ 17 июня 2009

У меня есть форма 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, которые (я полагаю) не показывают такое поведение.

Ответы [ 3 ]

6 голосов
/ 17 июня 2009

Чтобы сохранить нулевую дату / время в записи базы данных, просто наберите

qryAuftraege.FieldByName('MyDateField').clear;
4 голосов
/ 18 июня 2009

Обязательно проверьте параметры MySQL, как описано здесь ...

Затем я попытался бы использовать другой набор компонентов соединения, поскольку стек (драйвер ADO + ODBC 5.1) может быть проблемой здесь. Вы пробовали с другим драйвером ODBC? Или с DBX ...

0 голосов
/ 17 июня 2009

Я не знаю, как это сделать, но я всегда использовал

qryAuftraege.FieldByName('MyDateField').AsString:='';
...