FireDAC:节省SQLite DB的时间

时间:2014-11-14 01:41:34

标签: sqlite delphi time firedac

我是FireDAC的新手,遇到了问题。我想在Delphi XE7中用FireDAC读写SQLite数据库。我试过的大多数工作,但我有一个问题,将TTime保存到SQLite DB。

这有效:

FDQuery1.Fields[0].AsString := EdName.Text;

这不是:

FDQuery1.Fields[1].Value := TeTime.Time; // TeTime = TTimeEdit (FMX)

为什么呢?第一个字段是“REAL”,第二个字段是“NUMERIC”,如下所述:https://www.sqlite.org/datatype3.html

谢谢, LUMA

1 个答案:

答案 0 :(得分:2)

我没有相同的测试环境,所以结果可能会有所不同,但在使用旧版AnyDAC的Delphi XE3中,我运行了这个简单的测试:

ADQuery.Close;
ADQuery.SQL.Text := 'CREATE TABLE MyTable (Col NUMERIC)';
ADQuery.ExecSQL;

ADQuery.Close;
ADQuery.SQL.Text := 'INSERT INTO MyTable (Col) VALUES (:Val)';
ADQuery.Params[0].Value := TTime(EncodeTime(1, 2, 3, 4));
ADQuery.ExecSQL;

ADQuery.Close;
ADQuery.SQL.Text := 'SELECT Col FROM MyTable';
ADQuery.Open;

结果是获取的表字段的类型为ftLargeint,其值为0.因此,您刚刚使用此代码丢失了值。幸运的是,FireDAC为您提供了更好的方法。您可以创建一个包含自定义TIME字段类型的表格,如下所示:

CREATE TABLE MyTable (Col TIME)

FireDAC在内部将此类数据类型映射到dtTime字段类型(在this topic中描述),因此您可以本地访问此字段作为实时字段,例如:

ADQuery.Close;
ADQuery.SQL.Text := 'CREATE TABLE MyTable (Col TIME)';
ADQuery.ExecSQL;

ADQuery.Close;
ADQuery.SQL.Text := 'INSERT INTO MyTable (Col) VALUES (:Val)';
ADQuery.Params[0].AsTime := TTime(EncodeTime(1, 2, 3, 4));
ADQuery.ExecSQL;

ADQuery.Close;
ADQuery.SQL.Text := 'SELECT Col FROM MyTable';
ADQuery.Open;

ShowMessage(FormatDateTime('hh:nn:ss.zzz', ADQuery.Fields[0].AsDateTime));