2014-11-14 3 views
2

저는 FireDAC을 처음 사용하고있어서 문제가 있습니다. Delphi XE7에서 FireDAC로 SQLite 데이터베이스를 읽고 쓰고 싶습니다. 내가 시도한 대부분의 일을했지만 SQLite DB에 TTime을 저장하는 데 문제가 있습니다.FireDAC : SQLite DB 시간 절약

이 작동 :

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

이되지 않습니다

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

이유는 무엇입니까? 첫 번째 필드는 "REAL"이며, 여기에 설명 된대로 두 번째는 "숫자"입니다 : https://www.sqlite.org/datatype3.html

감사합니다, 루마

+1

컴파일러에서 알려주는 정확한 오류는 무엇입니까? 오류 메시지를 제공하지 않았기 때문에 코드가 컴파일되지 않는다고 가정합니다 (SQLite 또는 FireDAC을 사용한 적이 한번도 없습니다). 이 정보를 제공하지 않으면 타사 도구를 절대 사용하지 않는 저 같은 사람들은 대답 할 수 없습니다. 그러나 그 간단한 오류 메시지로, 나는 당신의 질문에 대답 할 수있을 것입니다. –

+0

SQLite 시간 필드를'NUMERIC'이 아닌'TIME'으로 만드십시오. ([여기는 FireDAC 매핑입니다.] (http://docwiki.embarcadero.com/RADStudio/XE7/en/Using_SQLite_with_FireDAC#Mapping_SQLite_to_FireDAC_Data_Types)). 그러면 AsTime 또는 AsDateTime 캐스팅을 편안하게 사용할 수 있습니다. – TLama

+0

@ JerryDodge : 오류 메시지가 없습니다. 위의 코드를 사용할 때 Field of Value는 0으로 설정됩니다. 그러나 읽기 작업 : SeTime.Text : = FDQuery1.Fields [1] .AsString; – LuMa

답변

2

내가 테스트하는 동일한 환경을 가지고, 그렇게하지 않는에게 결과가 다를 수 있습니다

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 그래서 그냥 잃어버린이었다이었다 : 당신을 위해,하지만 AnyDAC의 이전 버전과 델파이 XE3에서 나는이 간단한 테스트를 실행 이 코드로 귀하의 가치. 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));