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

Устранение проблемы с получением JSON из SQLite в Delphi/Pascal

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

В статье будет рассмотрена проблема, связанная с получением JSON из базы данных SQLite в Delphi/Pascal, и предложено решение этой проблемы.

Проблема: При получении JSON из базы данных SQLite с помощью TSQLQuery в Delphi/Pascal, возвращается строка, содержащая только 1021 символ, что приводит к неудачной попытке парсинга JSON.

Причина: Проблема заключается в том, что TSQLQuery не может правильно идентифицировать, что поле, возвращаемое из SELECT-оператора, является фактически TEXT-полем (ftMemo). В результате, значение отображается правильно в браузере DB (для SQLite), но в Pascal-коде оно обрезается до 1021 символов.

Решение: Есть два возможных решения этой проблемы.

Решение 1 (рабочее): Сохранять исходное JSON-значение в TEXT-поля в таблице базы данных. При получении значения из базы данных, использовать SELECT-оператор, чтобы получить значение из TEXT-поля. Пример кода:

CREATE TABLE MyTable (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    jsonObj JSON,
    jsonObjText TEXT
);

SELECT jsonObjText FROM MyTable

При обновлении таблицы, необходимо обновлять оба поля. Можно использовать одно и то же имя параметра в подготовленном SQL-запросе, чтобы Pascal-код назначал действительный JSON-текст только одному ParamByName(). Пример кода:

procedure saveJSONObj(const _id: int64; constref _jsonObj: TJSONObject);
const
    Q =
      'UPDATE MyTable ' + sLinebreak
    + 'SET jsonObj = jsonb(:jsonObj), ' + sLinebreak
    + 'jsonObjText = :jsonObj' + sLinebreak
    + 'WHERE id = :id';
 var
    _qry: TSQLQuery;
begin
    _qry := dbModule.newQuery(Q);
    try
        _qry.ParamByName('jsonObj').AsString := _jsonObj.FormatJSON(AsJSONFormat);
        _qry.ParamByName('id').AsLargeInt    := _id;
        _qry.ExecSQL;
    finally
        _qry.Free;
    end;
end;

Решение 2 (альтернативное): Использовать BLOB в качестве класса хранения вместо JSON. Пример кода:

CREATE TABLE MyTable (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    jsonObj BLOB
);

INSERT INTO MyTable(jsonObj) VALUES (jsonb(:jsonObj))

При получении значения из базы данных, использовать SELECT-оператор, чтобы получить значение в виде BLOB. Пример кода:

SELECT jsonObj FROM MyTable

При обновлении таблицы, необходимо обновить только поле jsonObj. Пример кода:

procedure saveJSONObj(const _id: int64; constref _jsonObj: TJSONObject);
const
    Q =
      'UPDATE MyTable ' + sLinebreak
    + 'SET jsonObj = jsonb(:jsonObj) ' + sLinebreak
    + 'WHERE id = :id';
 var
    _qry: TSQLQuery;
begin
    _qry := dbModule.newQuery(Q);
    try
        _qry.ParamByName('jsonObj').AsString := _jsonObj.FormatJSON(AsJSONFormat);
        _qry.ParamByName('id').AsLargeInt    := _id;
        _qry.ExecSQL;
    finally
        _qry.Free;
    end;
end;

Вывод: Первое решение является рабочим и позволяет правильно получать JSON-значения из базы данных SQLite в Delphi/Pascal. Второе решение является альтернативным и использует BLOB в качестве класса хранения вместо JSON. Выбор решения зависит от конкретных требований и предпочтений разработчика.

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

Проблема при получении JSON из SQLite в Delphi связана с ограничением в 1021 символ, которое обусловлено некорректным отображением текстового поля TSQLQuery, и предлагается решение через использование отдельного TEXT поля для хранения JSON или замену на B


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 22:17:18/0.0056891441345215/0