Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 12 июл 2024, 14:04

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: 11 авг 2022, 15:14 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 62
Здравствуйте!

При миграции с ZeosDBO 7.2 на ZeosDBO 8 столкнулся с проблемой: если в запросе есть поле numeric, то в связке TZQuery -> TDataSource -> TMemTableEh возникает исключение (SIGSEGV).
Исключение возникает в методе TCustomMemTableEh.SetFieldData. То же исключение выбрасывается при попытке обратиться к такому полю (Field.Value или Field.As%something%).

Небольшое исследование показало, что восьмая версия ZEOSDBO для таких полей устанавливает тип ftFMTBCD, который, видимо, неправильно обрабатывается в процедуре BufferToVar внутри метода TCustomMemTableEh.SetFieldData. После замены соответствующего блока в case на
Код:
      ftFMTBcd:
      {$IFDEF FPC}
        Data := VarFMTBcdCreate(TBcd(Buffer^));
      {$ELSE}
        if NativeFormat
          then DataConvert(Field, Buffer, @Data, False)
          else Data := VarFMTBcdCreate(TBcd(Buffer^));
      {$ENDIF}

всё заработало как надо. В принципе, изменения аналогичны обработке полей ftBCD в той же процедуре.
Если я правильно определил причину, можно ли добавить это в код библиотеки, чтобы не "лечить" исходник при каждом обновлении EhLib?

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 авг 2022, 20:13 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 62
Дополнение.

Технические подробности: Windows10, PostgreSQL 12, Lazarus trunk (с 2.2.2 такая же ситуация), ZeosDBO 8 trunk, EhLib 10.2.029

К сожалению, как надо не заработало. Скомпилировалось, данные добавляет без исключений, но вот не работает дальше.
Почти любая попытка обращения к такому полю, если значение не нулевое, приводит к исключению. Чаще всего это EOutOfRange, иногда бывает переполнение BCD, иногда eBCDNotImplementedException, которое вызывается в единственном случае, если TVarData.VType неизвестен модулю FmtBCD. Если исключения не возникает, то значения случайные, не те, которые в запись заносились. Складывается впечатление, что в структуре данных MemTableEh лежит указатель на некую область памяти, в которой находится мусор.

Точно установлено, что данные портятся за пределами метода
Код:
procedure TCustomMemTableEh.SetFieldData(Field: TField;  Buffer: Pointer; NativeFormat: Boolean);

(там из RecBuf во время отладки можно достать правильные данные).

В принципе, "родной" MemTable из Zeos работает корректно, но с ним будет невозможна локальная сортировка и фильтрация в DBGridEh. Откат обратно на Zeos 7.2 также нежелателен, потому что, кроме важных вещей, не относящихся к этой теме, поля типа numeric транслировались в поля TFloatField с соответствующей потерей точности (значения вроде 0,39999999999 вместо точного 0,4).

Вопрос: можно исправить работу с полями типа ftFMTBCD?

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 авг 2022, 03:52 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1576
Добрый день.

Вы можете кратко описать что такое ZeosDBO?
БД или библиотека для работы с какими-то БД?
Можете написать инструкцию, где и как скачивать и устанавливать нужные библиотеки чтобы протестировать данную проблему?
Есть ли у вас возможность создать тестовый проект, в котором бы присутствовал доступ к ZeosDBO через MemTable и через какой-то работающий DataSet?

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 авг 2022, 16:44 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 62
Здравствуйте!

Цитата:
Вы можете кратко описать что такое ZeosDBO?

Это библиотека доступа к данным, работает с несколькими серверами (mysql, postgresql, interbase, oracle и т.д.), на уровне компонентов предоставляет объекты-наследники TDataSet и необходимые объекты для взаимодействия с сервером (соединение, последовательности, слушатели событий и т.п.)

Цитата:
Можете написать инструкцию, где и как скачивать и устанавливать нужные библиотеки чтобы протестировать данную проблему?

Загружается с http://www.sourceforge.net/projects/zeoslib (subversion->branches->8.0 patches). Устанавливается пакет packages\lazarus\zcomponentdesign.lpk (он "потащит" за собой все остальные пакеты библиотеки). Сейчас проверил на "чистом" Lazarus 2.3.0, устанавливается без проблем.

Тестовый проект прикладываю. Объявление таблицы в файле data_stuctures.sql.


Вложения:
fmtbcd_ehlib.zip [6.06 KiB]
Скачиваний: 108
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 авг 2022, 17:26 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 62
Сейчас короткий эксперимент показал, что Zeos вообще ни при чём. Просто MemTableEh неправильно работает с полями ftFMTBCD в Lazarus (как минимум):
1. На форме лежит кнопка, MemTableEh, DataSource и DBGridEh (все свойства по-умолчанию, просто набросили компоненты, DataSource смотрит в MemTable, грид показывает то, что отдаёт DataSource).
2. По нажатию на кнопку выполняем:
Код:
  MemTableEh2.FieldDefs.Add('id',ftInteger, 4);
  MemTableEh2.FieldDefs.Add('bcd', ftFMTBcd, 14, 6, false, false, 1, CP_UTF8);
  MemTableEh2.CreateDataSet;
3. Пробуем вносить данные, получаем ошибку.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 авг 2022, 14:06 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 62
Добрый день!

Уважаемые разработчики, подскажите, есть ли какой-то прогноз по исправлению?
Спасибо.

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 сен 2022, 23:50 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1576
Добрый день.

Ошибку исправим в следующей сборке.
Спасибо за информацию.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 07 сен 2022, 16:04 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 62
Добрый день.

Проверено, сборка 10.2.031. Поля типа ftFmtBCD обрабатываются корректно.

С уважением
Евгений.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 фев 2023, 14:33 
Не в сети

Зарегистрирован: 10 фев 2023, 12:41
Сообщений: 13
edgen писал(а):
... Сейчас проверил на "чистом" Lazarus 2.3.0 ...

Камрад стесняюсь спросить... а где Вы взяли Лазарь 2.3 ? - на официальном сайте пока только 2.2.4...
Да, еще один момент. В Лазаре в Online Package Manager есть репозиторий ZeosDBO, но мне показалось, что там библиотека (при всём сходстве в именах пакетов) несколько отличается от ZeosLib, который скачивается с Sourceforge... по крайней мере в прошлом году у меня была какая-то проблема, когда я при переустановке Лазаря решил поставить именно "встроенный" пакет - и потом попытался открыть существующий проект. Разбираться не стал, просто переустановил библиотеку. Ничего по этому поводу не знаете?

_________________
Старый опытный камикадзе...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 фев 2023, 15:44 
Не в сети

Зарегистрирован: 25 фев 2019, 14:39
Сообщений: 62
Python писал(а):
edgen писал(а):
... Сейчас проверил на "чистом" Lazarus 2.3.0 ...

Камрад стесняюсь спросить... а где Вы взяли Лазарь 2.3 ? - на официальном сайте пока только 2.2.4...

Да, это моя опечатка. На самом деле я пользуюсь одновременно транком Lazarus и Codetyphon (он в некоторых моментах мне удобнее), для проверок иногда ставлю готовую сборку с оф.сайта. В данном случае как раз 2.2.4 была.

Python писал(а):
Да, еще один момент. В Лазаре в Online Package Manager есть репозиторий ZeosDBO, но мне показалось, что там библиотека (при всём сходстве в именах пакетов) несколько отличается от ZeosLib, который скачивается с Sourceforge... по крайней мере в прошлом году у меня была какая-то проблема, когда я при переустановке Лазаря решил поставить именно "встроенный" пакет - и потом попытался открыть существующий проект. Разбираться не стал, просто переустановил библиотеку. Ничего по этому поводу не знаете?

Я не люблю менеджер пакетов Лазаря именно по причине того, что неизвестно какая именно версия или из какого коммита пакет собран. Но, наверно, не стоит откровенно оффтопить, предлагаю в личку перейти.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB