2

我是 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

谢谢,卢马

4

1 回答 1

2

我没有相同的环境来测试,所以结果对你来说可能会有所不同,但是在 Delphi XE3 和旧版本的 AnyDAC 中,我运行了这个简单的测试:

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));
于 2014-11-14T14:16:09.497 回答