Delphi - 将DateTime Null保存到DB(ADO/MySQL)

Tar*_*haf 2 mysql delphi odbc ado date

我有一个带有一些数据库控件的Delphi表单.

为了表示一个日期,我使用了TJvDBDatePickerEdit(来自JCL),它有一个很好的属性

ShowCheckBox := True;
Run Code Online (Sandbox Code Playgroud)

允许用户输入没有已知日期(DBNull).

我验证,使DatePicker归零按预期工作:

procedure Tframe.adoQueryBeforePost(DataSet: TDataSet);
begin
  if (qryAuftraege.FieldByName('MyDateField').IsNull) then
  begin
    ShowMessage('IsNull!');
  end;
end;
Run Code Online (Sandbox Code Playgroud)

消息框显示.所以ADO组件应该写的字段是varNull类型.

现在有这个管道:

TADOQuery -> TADOConnection -> MS OLE DB Provider for ODBC Drivers -> MySQL ODBC 5.1 Driver
Run Code Online (Sandbox Code Playgroud)

MySQL ODBC驱动程序现在显示在它的日志中:

UPDATE `db`.`table` SET `MyDateField`=_latin1'0004-00-00' WHERE `ID`=5 AND `MyDateField`=_latin1'2009-06-17';
Run Code Online (Sandbox Code Playgroud)

好吧,日期存储为'0004-00-00'(MySQL似乎保存这样).现在在查询条目时,它被Delphi识别为Null,但是当它下次更新时,调用:

UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
Run Code Online (Sandbox Code Playgroud)

当然失败了,因为MyDateField不是NULL(至少在MySQL DB中).

这个字符串'0004-00-00'来自哪里?如果它是某个地方的错误,我可以在哪里拦截它?

我已经知道有些组件可以提供直接的MySQL连接(我假设)没有显示这种行为.

ska*_*adt 6

要将空日期/时间保存到数据库记录,只需调用即可

qryAuftraege.FieldByName('MyDateField').clear;
Run Code Online (Sandbox Code Playgroud)