Вопрос пользователя связан с ошибкой типа данных, возникающей при работе с TFDQuery и базой данных SQLite в среде разработки Delphi 10.2. Ошибка возникает, когда запрос к базе данных не возвращает результатов, и вместо ожидаемого типа LargeInt возвращается WideString. Это приводит к исключению EDatabaseError при использовании TFDQuery с заранее определенными полями, необходимыми для работы с компонентом TeeChart.
Оригинальный заголовок
TFDQuery and SQLite: Type mismatch for field, expecting: LargeInt actual: WideString
Описание проблемы (вопрос)
При использовании Delphi 10.2, SQLite и компонента Teecharts, в базе данных SQLite созданы две таблицы с полями:
Пользователь обращается к таблице с помощью TFDQuery, названного qryGrpahRuntime, с SQL-запросом:
SELECT DayTime AS TheDate, Sum(Device1) As DeviceTotal
FROM HistoryRuntime
WHERE (DayTime >= "2017-06-01") and (DayTime <= "2017-06-26")
Group by Date(DayTime)
В редакторе полей в IDE Delphi добавлены два сохраняемых поля: TheDate как TDateTimeField и DeviceTotal как TLargeIntField.
При выполнении запроса для создания графика TeeChart, если результаты отсутствуют, возникает исключение EDatabaseError с сообщением об ошибке типа данных.
Попытки использовать CAST в запросе не приводят к изменению результата.
Подтвержденный ответ
Проблема связана с тем, что при отсутствии данных в результате запроса, SQLite возвращает поле типа WideString, что приводит к несоответствию типов данных с заранее определенными полями в TFDQuery.
Решение заключается в явном указании типа данных для полей в запросе, что позволяет FireDAC корректно обработать результат. Для этого необходимо добавить к алиасу столбца указание типа данных, например:
SELECT
DayTime AS "TheDate",
Sum(Device1) AS "DeviceTotal::BIGINT"
FROM
HistoryRuntime
WHERE
DayTime BETWEEN {d 2017-06-01} AND {d 2017-06-26}
GROUP BY
Date(DayTime)
Важно использовать тип данных, который соответствует типу сохраняемого поля в TFDQuery и не является автоматически увеличиваемым, например BIGINT.
Это решение описано в разделе "Adjusting FireDAC Mapping" руководства FireDAC по использованию SQLite.
Пример кода
// Создание запроса к базе данных SQLite
var
qryGrpahRuntime: TFDQuery;
begin
qryGrpahRuntime := TFDQuery.Create(nil);
try
qryGrpahRuntime.Connection := YourConnectionComponent; // Подключение к компоненту соединения
qryGrpahRuntime.SQL.Clear;
qryGrpahRuntime.SQL.Add('SELECT DayTime AS "TheDate", Sum(Device1) AS "DeviceTotal::BIGINT" FROM HistoryRuntime WHERE DayTime BETWEEN {d 2017-06-01} AND {d 2017-06-26} GROUP BY Date(DayTime)');
qryGrpahRuntime.Open;
// Дальнейшая работа с данными
finally
qryGrpahRuntime.Free;
end;
end;
Использование указанного решения позволяет избежать ошибки типа данных при работе с TFDQuery и SQLite, а также обеспечивает корректное отображение данных в компоненте TeeChart.
Пользователь сталкивается с проблемой несоответствия типов данных в результате запроса к базе данных SQLite в среде Delphi 10.2, что приводит к ошибке при использовании компонента TFDQuery с заранее определенными полями для работы с TeeChart.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS