Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.10.2013, 08:23
podkashey podkashey вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 2
Репутация: 10
По умолчанию tDbf Ошибка: Division by zero при наличии Memo

Имеется база в firebird, требуется из нее выгрузить некоторые данные в .dbf-файлы, включая поля memo. Для этого использую компонент tDbf. В частности, поля типа memo заполняю через потоки следующим образом:
Код:
(Dbf1.FieldByName('P') as TBlobField).LoadFromStream(DBModule.query.CreateBlobStream(D BModule.query.FieldByName('P'),bmRead) as TStream);
Не знаю правильно так или не совсем, но вроде бы работает. Проблема возникает на процедуре Dbf1.Post; - выскакивает ошибка Division by zero. Пытался разглядеть, как такое получается (благо tDbf опенсурс) - оказалось, что в файле dbf_memo.pas есть следующий код:
В процедуре procedure
Код:
TMemoFile.WriteMemo(var BlockNo: Integer; ReadSize: Integer; Src: TStream);
код:
Код:
if ((bytesBefore + Src.Size + bytesAfter + RecordSize-1) div RecordSize)
<= ((ReadSize + RecordSize-1) div RecordSize) then
На этой строке и возникает ошибка деления на нуль. Собственно, непонятно, где в компоненте выставляется значение RecordSize. На сколько я понял, в нем передается размер мемо поля, которое планируется записать. Если по Cntrl+F7 просматривать это значение, то сначала оно имеет приемлемый вид, то есть примерно столько, сколько и передаю в потоке, потом не определено, потом 0. Самое странное, что если по Cntrl+F7 смотреть значение RecordSize, то будет 0, а если значение:
( Src.Size - Src.Size) + RecordSize, то будет уже: -1994891087. Хотя если слагаемые поменять местами, то снова будет 0.
Думал как-то избавиться от целочисленного деления, например сократив обе части на div RecordSize, но так ИМХО несколько нарушится логика программы. Также пытался сделать вместо div RecordSize: div ((Src.Size - Src.Size) + RecordSize), но все равно возникала та же ошибка.
Код:
Код:
rs: Int64;
rs:= (Src.Size - Src.Size) + RecordSize;
и замена условия на:
if ((bytesBefore + Src.Size + bytesAfter + rs-1) div rs)
<= ((ReadSize + rs-1) div rs) then
записывает в rs нуль и результат не меняется.
Самое странное, что было время, когда программа нормально отрабатывала, но что-то пошло не так и перестала... SVN не юзаю, так что откатиться не могу. Также странно, что по запросу "Division by zero tdbf" гугл молчит, значит ошибка не распространенная. Может я неправильно потоки использую для переноса blob firebird в memo .dbf? Хотя пробую наполнять memo из файла таким образом:
Код:
(Dbf1.FieldByName('P') as TBlobField).LoadFromFile('c:\ses.txt');
возникает та же самая ошибка. Хотя раньше такой вариант точно отрабатывал. Компоненту tDbf заново скачивал и переставлял уже много раз.
TDbf использовался не от Брусникина Игоря Викторовича (http://www.delphisources.ru/pages/so...comp_tdbf.html), а вот этот: http://tdbf.sourceforge.net/ Первый вроде как с memo работать не умеет.

MAD: пользуемся тегами, или последуют санкции.

Последний раз редактировалось M.A.D.M.A.N., 24.10.2013 в 09:11.
Ответить с цитированием
  #2  
Старый 24.10.2013, 09:11
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Явно переменные равны нулю, делай доп проверку.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 24.10.2013, 09:38
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Мне нравится эта часть кода:
Код:
(Src.Size - Src.Size) + RecordSize;
Проникся прям

Ключ находится в этом месте:

Цитата:
Пытался разглядеть, как такое получается (благо tDbf опенсурс)
Есть смысл найти ошибку этого "опенсорус"-проекта и исправить её.

Последний раз редактировалось Uniq!, 24.10.2013 в 09:45.
Ответить с цитированием
  #4  
Старый 25.10.2013, 07:30
podkashey podkashey вне форума
Прохожий
 
Регистрация: 06.02.2012
Сообщения: 2
Репутация: 10
По умолчанию

В чем было дело так и не разобрался, но вспомнил, что это началось после того как скопировал проект в новую директорию, чтобы откатиться ежели чего. Запустил проект из старой директории - все нормально отрабатывает и блобы записываются. И RecordSize равен нормальному числу. Причем не ясно, что было не так, так как все библиотеки и прочие БД ФБ имели относительные пути, сами компоненты переставлялись итд...
Ответить с цитированием
  #5  
Старый 25.10.2013, 10:06
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну блин, чего тут не понятного то, у тебя после div переменные имеют значения 0, надо ставить точки остановка на эти места и проверять, почему там 0.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter