Имеется база в 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: пользуемся тегами, или последуют санкции.