Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка при чтении больших чисел из SQLite с использованием ZeosLib в Delphi XE2: Поиск решения проблемы

Delphi , Базы данных , SQL

В статье рассматривается проблема, с которой разработчики могут столкнуться при работе с компонентами ZeosLib и Delphi XE2 при чтении данных из базы данных SQLite. Проблема заключается в том, что при попытке прочитать три значения timestamp, которые хранятся в базе данных в виде чисел с семнадцатью цифрами, вместо ожидаемого значения возвращается ноль. Рассмотрим подробнее контекст проблемы и предложенные решения.

Описание проблемы

Разработчик столкнулся с проблемой при использовании компонентов ZeosLib для чтения данных из SQLite базы в проекте на Delphi XE2. Все функции работали корректно, за исключением чтения значений полей creation_utc, expires_utc и last_access_utc, которые представляют собой большие числа. При попытке прочитать эти значения с помощью метода .AsLargeInt возвращалось значение ноль. Были попытки получить данные как Variant, а затем привести к Integer, Int64 или String, но результат оставался неизменным. Также было отмечено, что использование компонентов DISqlite3 приводило к успешному чтению данных, однако они являются shareware, и предпочтение было отдано freeware решениям.

Пример кода

procedure TCookieImporter.LoadCookies(const AChromeDatabase: String);
var
  zconn          : TZConnection;
  zquery         : TZReadOnlyQuery;
  creation_utc   : Int64;
  expires_utc    : Int64;
  last_access_utc: Int64;
  // ... остальной код ...
begin
  // ... инициализация соединения ...
  while not zquery.Eof do
  begin
    // Проблема: следующие три строки возвращают ноль
    creation_utc := zquery.FieldByName('creation_utc').AsLargeInt;
    expires_utc := zquery.FieldByName('expires_utc').AsLargeInt;
    last_access_utc := zquery.FieldByName('last_access_utc').AsLargeInt;
    // ... остальной код ...
  end;
  // ... закрытие соединения ...
end;

Предложенные решения

В комментариях было предложено использовать метод Trunc(...AsDouble), который, хоть и не является идеальным решением, может помочь. Также было предложено использовать Open Source классы для прямого доступа к SQLite3 с полной скоростью, например, SynDBSQLite3. Разработчик отметил, что SynDBSQLite3 работал без проблем.

Другое предложение заключалось в определении полей как BIGINT в базе данных, что обсуждалось на форуме ZeosLib.

Подтвержденный ответ

Разработчик, столкнувшийся с проблемой, создал тему на официальном форуме ZeosLib и получил следующий ответ:

Zeos - это общий компонент доступа. Я знаю, что мы могли бы предположительно использовать типы Int64 для полей Integer.

На самом деле мы используем BIGINT, чтобы предположительно отображать поля TLongInt. Это то, что большинство систем управления базами данных используют для этого.

Это открытое обсуждение. Внутренне SQLite принимает два привязывания Integer для подготовленных запросов. Это не проблема для внесения изменений в этот патч.

Таким образом, другие могут здесь же высказаться, если мы должны изменить это или нет. Если сомневаетесь, то начиная с 7.2, но не в 7.0 или 7.1. Подумайте об этом: Это код, который существует уже долгое время, и он может вызвать кучу проблем, если пользователи обновят свои компоненты.

Заключение

Проблема чтения больших чисел из SQLite базы с использованием ZeosLib в Delphi XE2 может быть решена с помощью использования альтернативных компонентов, таких как SynDBSQLite3, или путем внесения изменений в сам ZeosLib, как обсуждалось на форуме. Важно помнить о совместимости с текущей версией компонентов и возможных последствиях обновления кода.

Создано по материалам из источника по ссылке.

Разработчик столкнулся с ошибкой при чтении больших чисел из базы данных SQLite с использованием компонентов ZeosLib в среде Delphi XE2, что приводило к возвращению нулевых значений вместо ожидаемых timestamp.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 13:51:04/0.0056900978088379/1