我有一个带有一些数据库控件的 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 连接(我假设)不会显示这种行为。
最佳答案
要将空日期/时间保存到数据库记录,只需调用
qryAuftraege.FieldByName('MyDateField').clear;
关于mysql - Delphi - 将 DateTime Null 保存到 DB (ADO/MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1007824/