Delphi SqLite 日期加载到 TDateEdit 错误

Delphi SqLite Date load to TDateEdit error

我在我的 Firemonkey Android 应用程序中使用 SQlite 数据库,但没有本地 DateTime 类型。

我将日期存储为文本类型

插入命令:

insert into table (value,date_of_change)
values (:val,date('now'));

它工作正常,日期存储正确,按日期排序工作正常但如果我想将此日期加载到 TDate 编辑

查询:

select id,value,date_of_change
from table
where id = :MyID

代码:

FDQuery1.Close;
FDQuery1.ParamByName('MyID').Value:= myid;
FDQuery1.OpenOrExecute;
FDQuery1.First;

NumberBox1.Value:=FDQuery1.FieldByName('suma').AsFloat;
DateEdit1.Date:=FDQuery1.FieldByName('date_of_change').AsDateTime;

我收到错误 2016-10-16 不是有效的日期和时间 但在日期编辑中我可以看到正确的日期!

有人知道这个问题的正确解决方案吗?

由于您将日期存储为字符串,因此 FireDAC 无法正确解析格式。您需要更改使用正确的日期格式解析数据库列 date_of_change 中的字符串值的方式。

所以,与其这样做:

DateEdit1.Date:=FDQuery1.FieldByName('date_of_change').AsDateTime;

你应该这样做:

function ParseDateFromDB(const DateStr: String): TDateTime;
var
  FormatSettings: TFormatSettings;
begin
  FormatSettings.DateSeparator := '-';
  FormatSettings.ShortDateFormat := 'YYYY-MM-DD';
  Result := StrToDate(DateStr, FormatSettings);
end;

//[...]

DateEdit1.Date := ParseDateFromDB(FDQuery1.FieldByName('date_of_change').AsString);

FireDAC 使用自己的 mapping to SQLite data types 并为您添加 DATE 伪数据类型。因此,可以使用 SINGLE 伪数据类型来存储该数字框的值。

因此您可以像这样通过 FireDAC 创建您的 table:

FDQuery.SQL.Text := 'CREATE TABLE MyTable (DateField DATE, SingleField SINGLE)';
FDQuery.ExecSQL;

然后就可以插入数据了:

FDQuery.SQL.Text := 'INSERT INTO MyTable (DateField, SingleField) VALUES (:DateField, :SingleField)';
FDQuery.ParamByName('DateField').AsDate := DateEdit.Date;
FDQuery.ParamByName('SingleField').AsSingle := NumberBox.Value;
FDQuery.ExecSQL;

并以这种方式阅读它们:

FDQuery.SQL.Text := 'SELECT DateField, SingleField FROM MyTable';
FDQuery.Open;
DateEdit.Date := DateOf(FDQuery.FieldByName('DateField').AsDateTime);
NumberBox.Value := FDQuery.FieldByName('SingleField').AsSingle;