我有以下......
var
LCnn: TADOConnection;
qryGetData: TADOQuery;
begin
...
//build a connection string to a SQL Server 2008
...
qryGetData.Connection := LCnn;
qryGetData.SQL.Text := 'SELECT * FROM MYTABLE'
...
LDate := qryGetData.FieldByName('Date').AsDateTime; //Date its a datetime field in the table
end;
这样可以正常工作但是,当某些Pcs中的“Date”字段为NULL时,LDate为0而另一个为-36522。
任何想法??? 谢谢!
编辑:
奇怪的行为是
function TDateTimeField.GetAsDateTime: TDateTime;
begin
if not GetValue(Result) then Result := 0;
end;
在第一种情况下,GetValue结果为false所以GetAsDateTime结果为0,在第二种情况下GetValue结果为true所以返回-36522(01/01/1800)
答案 0 :(得分:6)
TDateTime
没有空值。这意味着如果数据库具有空日期,那么您的程序是错误的。你需要给这样的日期特殊待遇。一旦确定该字段不为空,则仅调用AsDateTime
。如果遇到空字段,则需要以某种特殊方式处理该字段,但是您不能在TDateTime
中放置明确表示null的值,因为没有这样的值。
答案 1 :(得分:5)
扩展David的回答:
处理NULL
日期问题的一种方法是调整查询,使其不使用sql COALESCE
语句返回NULL
,而是返回任意日期。
qryGetData.SQL.Text :=
'SELECT Id, COALESCE(Date, '''1/1/1900 00:00:00'''), WhatEverFieldYouNeed FROM MYTABLE';
...
LDate := qryGetData.FieldByName('Date').AsDateTime;
这样您可以检查日期的年份是否为1900(这意味着DB值为NULL)并相应地处理。确保明智地选择默认日期值,以使其不在数据库中的预期日期范围内。
第二种方法是检查值是否真的NULL
并且不依赖于隐式转换。
if qryGetData.FieldByName('Date').IsNull then ...