2014-11-14 19 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));