2009-06-17 3 views
2

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

ответ

4

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

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

+0

или ZEOSLIB (бесплатно), MyDAC (не бесплатно) для собственного доступа к MySQL. –

+0

хотя я не пробовал, я думаю, вы правы в том, что проблема находится в стеке. Теперь я переключусь на Postgres (у которого есть более подходящая модель лицензирования), потому что я не привязан к MySQL. Вероятно, я также попробую Zeoslib. Благодарю. – Tarnschaf

+0

Поскольку эти вопросы, похоже, привлекают внимание: переключение на Postgres с Zeoslib решило проблему. – Tarnschaf

6

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

qryAuftraege.FieldByName('MyDateField').clear; 
+0

Спасибо, но поскольку я указал, что значение MyDateField для ADOQuery уже имеет значение Null, метод clear() не изменяет это и неправильное поведение драйвера впоследствии. – Tarnschaf

-1

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

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

Совершенно неправильно. Большинство РСУБД различают NULL (не назначено значение) и '' (пустая строка назначена). Oracle является единственной основной RDBMS, которая не считает NULL и «как разные». –

+0

И Firebird тоже, я использовал его около 5 лет и никогда не сталкивался с этим проблемой –

+0

спасибо за подсказку, поскольку два других комментария сказали, что это не совсем то, что я хотел, хотя на удивление кажется, что он имеет тот же эффект (на самом деле это NULL). Но ошибка по-прежнему ПОСЛЕ того, когда драйвер назначает «0004-00-00» в поле фактической базы данных – Tarnschaf

 Смежные вопросы

  • Нет связанных вопросов^_^