2016-10-16 2 views
1

Я использую базу данных SQlite im my приложение для Android Firemonkey и нет родного типа DateTime.Delphi SqLite Дата load to TDateEdit error

Я хранение даты в текстовом типе

команда вставки:

insert into table (value,date_of_change) 
values (:val,date('now')); 

он отлично работает, дата правильно хранятся, заказ по дате работает нормально, но если я хочу загрузить эту дату в TDate редактировать

запрос:

select id,value,date_of_change 
from table 
where id = :MyID 

код:

FDQuery1.Close; 
FDQuery1.ParamByName('MyID').Value:= myid; 
FDQuery1.OpenOrExecute; 
FDQuery1.First; 

NumberBox1.Value:=FDQuery1.FieldByName('suma').AsFloat; 
DateEdit1.Date:=FDQuery1.FieldByName('date_of_change').AsDateTime; 

Я получаю ошибку 2016-10-16 не действует дата и время но Дата редактирования можно увидеть точную дату!

Неужели кто-нибудь знает правильное решение этой проблемы?

ответ

2

Поскольку вы храните дату в виде строки, FireDAC не может правильно проанализировать формат. Вам нужно изменить способ, которым строковое значение в столбце базы данных date_of_change анализируется с использованием правильного формата даты.

Таким образом, вместо того, чтобы сделать это:

DateEdit1.Date:=FDQuery1.FieldByName('date_of_change').AsDateTime; 

Вы должны сделать это:

function ParseDateFromDB(const DateStr: String): TDateTime; 
var 
    FormatSettings: TFormatSettings; 
begin 
    FormatSettings.DateSeparator := '-'; 
    FormatSettings.ShortDateFormat := 'YYYY-MM-DD'; 
    Result := StrToDate(DateStr, FormatSettings); 
end; 

//[...] 

DateEdit1.Date := ParseDateFromDB(FDQuery1.FieldByName('date_of_change').AsString); 
+0

Спасибо , теперь он отлично работает! Но теперь у меня есть обратная проблема ... Мне нужно сохранить форму даты DateEdit и этот код 'FDCommand1.ParamByName ('date_of_change'). Значение: = dateedit1.Date;' save 2016-10-16 as 459-09-11 – milenjao

+0

Я думал, что тип TDate относится к этим вещам! – milenjao

+0

См. Документацию для 'FormatDateTime': http://www.delphibasics.co.uk/RTL.asp?Name=formatdatetime – Wosi

0

FireDAC использует свой собственный mapping to SQLite data types и добавляет DATE псевдо тип данных для вас. Так как существует псевдо-тип данных SINGLE, который вы можете использовать для хранения значения этого номера.

Таким образом, вы можете создать свою таблицу FireDAC так:

FDQuery.SQL.Text := 'CREATE TABLE MyTable (DateField DATE, SingleField SINGLE)'; 
FDQuery.ExecSQL; 

Затем вы можете вставить данные:

FDQuery.SQL.Text := 'INSERT INTO MyTable (DateField, SingleField) VALUES (:DateField, :SingleField)'; 
FDQuery.ParamByName('DateField').AsDate := DateEdit.Date; 
FDQuery.ParamByName('SingleField').AsSingle := NumberBox.Value; 
FDQuery.ExecSQL; 

И читать их, например, таким образом:

FDQuery.SQL.Text := 'SELECT DateField, SingleField FROM MyTable'; 
FDQuery.Open; 
DateEdit.Date := DateOf(FDQuery.FieldByName('DateField').AsDateTime); 
NumberBox.Value := FDQuery.FieldByName('SingleField').AsSingle;