代码之家  ›  专栏  ›  技术社区  ›  Tarnschaf

delphi-将datetime空值保存到db(ado/mysql)

  •  2
  • Tarnschaf  · 技术社区  · 17 年前

    我有一个Delphi表单,上面有一些DB控件。

    为了表示日期,我使用 TJvDBDatePickerEdit (来自JCL),这是一个很好的财产

    ShowCheckBox := True;
    

    允许用户输入未知日期(dbnull)。

    我确认,取消日期选取器的工作方式符合预期:

    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会将其识别为空,但下次需要更新时,调用:

    UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
    

    当然失败了,因为mydateField不是空的(至少在mysql数据库中)。

    这个绳子在哪 '044-00 -00’ 来自何方?如果是某个地方的bug,我可以在哪里拦截它?

    我已经知道有一些组件需要购买,它们提供直接的MySQL连接(我假设)不会显示这种行为。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Francesca    17 年前

    确保按照讨论的方式检查您的MySQL选项 here

    然后,我将尝试使用一组不同的连接组件,因为堆栈(ADO+ODBC5.1驱动程序)可能是这里的问题。
    你试过其他的ODBC驱动程序吗? 或者用DX…

        2
  •  6
  •   skamradt    17 年前

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

    qryAuftraege.FieldByName('MyDateField').clear;
    
        3
  •  -1
  •   José Romero    17 年前

    我不知道这样做的意义,但我一直用

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