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连接(我假设)没有显示这种行为.
要将空日期/时间保存到数据库记录,只需调用即可
qryAuftraege.FieldByName('MyDateField').clear;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6300 次 |
| 最近记录: |