我是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
答案 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));