"EhLib.Com" https://forum.ehlib.com/ru/ |
|
Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD https://forum.ehlib.com/ru/viewtopic.php?f=4&t=3246 |
Страница 1 из 1 |
Автор: | edgen [ 11 авг 2022, 15:14 ] |
Заголовок сообщения: | Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Здравствуйте! При миграции с 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? С уважением Евгений. |
Автор: | edgen [ 16 авг 2022, 20:13 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Дополнение. Технические подробности: 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? С уважением Евгений. |
Автор: | EhLibSupport [ 17 авг 2022, 03:52 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Добрый день. Вы можете кратко описать что такое ZeosDBO? БД или библиотека для работы с какими-то БД? Можете написать инструкцию, где и как скачивать и устанавливать нужные библиотеки чтобы протестировать данную проблему? Есть ли у вас возможность создать тестовый проект, в котором бы присутствовал доступ к ZeosDBO через MemTable и через какой-то работающий DataSet? |
Автор: | edgen [ 17 авг 2022, 16:44 ] | ||
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD | ||
Здравствуйте! Цитата: Вы можете кратко описать что такое 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.
|
Автор: | edgen [ 17 авг 2022, 17:26 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Сейчас короткий эксперимент показал, что Zeos вообще ни при чём. Просто MemTableEh неправильно работает с полями ftFMTBCD в Lazarus (как минимум): 1. На форме лежит кнопка, MemTableEh, DataSource и DBGridEh (все свойства по-умолчанию, просто набросили компоненты, DataSource смотрит в MemTable, грид показывает то, что отдаёт DataSource). 2. По нажатию на кнопку выполняем: Код: MemTableEh2.FieldDefs.Add('id',ftInteger, 4); 3. Пробуем вносить данные, получаем ошибку.
MemTableEh2.FieldDefs.Add('bcd', ftFMTBcd, 14, 6, false, false, 1, CP_UTF8); MemTableEh2.CreateDataSet; |
Автор: | edgen [ 29 авг 2022, 14:06 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Добрый день! Уважаемые разработчики, подскажите, есть ли какой-то прогноз по исправлению? Спасибо. С уважением Евгений. |
Автор: | EhLibSupport [ 01 сен 2022, 23:50 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Добрый день. Ошибку исправим в следующей сборке. Спасибо за информацию. |
Автор: | edgen [ 07 сен 2022, 16:04 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Добрый день. Проверено, сборка 10.2.031. Поля типа ftFmtBCD обрабатываются корректно. С уважением Евгений. |
Автор: | Python [ 10 фев 2023, 14:33 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
edgen писал(а): ... Сейчас проверил на "чистом" Lazarus 2.3.0 ... Камрад стесняюсь спросить... а где Вы взяли Лазарь 2.3 ? - на официальном сайте пока только 2.2.4... Да, еще один момент. В Лазаре в Online Package Manager есть репозиторий ZeosDBO, но мне показалось, что там библиотека (при всём сходстве в именах пакетов) несколько отличается от ZeosLib, который скачивается с Sourceforge... по крайней мере в прошлом году у меня была какая-то проблема, когда я при переустановке Лазаря решил поставить именно "встроенный" пакет - и потом попытался открыть существующий проект. Разбираться не стал, просто переустановил библиотеку. Ничего по этому поводу не знаете? |
Автор: | edgen [ 16 фев 2023, 15:44 ] |
Заголовок сообщения: | Re: Lazarus+ZeosDBO+Ehlib: ошибка для полей ftFMTBCD |
Python писал(а): edgen писал(а): ... Сейчас проверил на "чистом" Lazarus 2.3.0 ... Камрад стесняюсь спросить... а где Вы взяли Лазарь 2.3 ? - на официальном сайте пока только 2.2.4... Да, это моя опечатка. На самом деле я пользуюсь одновременно транком Lazarus и Codetyphon (он в некоторых моментах мне удобнее), для проверок иногда ставлю готовую сборку с оф.сайта. В данном случае как раз 2.2.4 была. Python писал(а): Да, еще один момент. В Лазаре в Online Package Manager есть репозиторий ZeosDBO, но мне показалось, что там библиотека (при всём сходстве в именах пакетов) несколько отличается от ZeosLib, который скачивается с Sourceforge... по крайней мере в прошлом году у меня была какая-то проблема, когда я при переустановке Лазаря решил поставить именно "встроенный" пакет - и потом попытался открыть существующий проект. Разбираться не стал, просто переустановил библиотеку. Ничего по этому поводу не знаете? Я не люблю менеджер пакетов Лазаря именно по причине того, что неизвестно какая именно версия или из какого коммита пакет собран. Но, наверно, не стоит откровенно оффтопить, предлагаю в личку перейти. |
Страница 1 из 1 | Часовой пояс: UTC |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |