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

标签 mysql delphi date odbc ado

我有一个带有一些数据库控件的 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/

相关文章:

德尔福7 : an abstract class through VFI

c# - 检测季度最后一个月的第三个星期五

日期格式之间的MySQL

delphi - RAD Studio 源代码标记/可视化的解释

c# - WCF 和 Delphi - 我应该使用 bytes[] 还是字符串?

sql - Oracle SQL 查询列出两个日期之间的周数

mysql - 如何在不使用 now() 的情况下在特定时间段内过滤 mysql 中的 select 语句

c# - 需要数据库结构的建议(MS SQL/MySQL)

MySQL Composite PK 与 Nullable FK

mysql - 如果我正在访问的字段是复合索引的一部分,我是否仍能从仅引用其中一个字段的索引中受益?