2014-11-14 71 views
2

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

这工作:

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

这不:

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

为什么?第一个字段是一个“真正的”,第二个是“数字”的解释在这里:https://www.sqlite.org/datatype3.html

感谢, 亮度

+1

编译器告诉你什么是确切的错误?由于您没有向我们提供错误消息,因此我只假设您的代码无法编译(我从未使用过SQLite或FireDAC)。当你不提供这些信息时,像我这样从未使用第三方工具组合的人无法回答。但有了这个简单的错误信息,我可能会回答你的问题。 –

+0

将您的SQLite时间字段创建为'TIME',而不是'NUMERIC'(['这里是FireDAC映射'](http://docwiki.embarcadero.com/RADStudio/XE7/en/Using_SQLite_with_FireDAC#Mapping_SQLite_to_FireDAC_Data_Types))。然后,您可以舒适地使用'AsTime'或'AsDateTime'投射。 – TLama

+0

@JerryDodge:没有错误信息,那就是问题所在。当我使用上面的代码时,字段的值仅设置为0。然而,阅读作品: SeTime.Text:= FDQ​​uery1.Fields [1] .AsString; – LuMa

回答

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));