BLOB. Проблема перехода с Delphi7 на Delphi2010
Добавлено: 26 окт 2012, 11:08
Есть: Win XP SP3 (32 бит), FB 2.5 (32 бит), приложение, компилированное на D7.
Несколько десятков БД с одинаковой структурой (данные, разумеется, разные), пришедших из далекого прошлого, когда деревья были большие, а страница в FB маленькие, не больше 4 Кб. Правда, в БД почему-то так и остались страницы в 1 Кб.
За эти 10 лет упомянутые БД прошли через все версии FB, докатившись до 2.5 и при замене версии FB без резервирования/восстановления (ОДС меналось автоматом, а что еще не шибко далекому человеку надо).
Проблема появилась тогда, когда приложение началось переноситься на D2010.
В некоторых таблицах есть БЛОБ поля (изначально установленные в подтип 1, наверное, из-за того что в эти поля может записываться и текст и бинарные данные).
В D2010 ни компоненты IBX, ни компоненты из dbExpress (оказалось, там теперь есть драйвер для FB) не читают правильно бинарные данные.
В массиве присутствуют нулевые байты (#0). Все чтение заканчивается на первом попавшемся символе нуля. Если в этом поле сохранен текст, то все в порядке - чтение происходит полное. Замена подтипа 1 на подтип 0 БЛОБа ничего не меняет - проблема остается.
Попытки чтения:
На всякий случай, может кто заинтересуется проблемой, одну из небольших баз можно взять здесь: http://athenasoft.ru/src/mazada.zip
Таблица LIBMODS, поле MOD - первые две записи.
Несколько десятков БД с одинаковой структурой (данные, разумеется, разные), пришедших из далекого прошлого, когда деревья были большие, а страница в FB маленькие, не больше 4 Кб. Правда, в БД почему-то так и остались страницы в 1 Кб.
За эти 10 лет упомянутые БД прошли через все версии FB, докатившись до 2.5 и при замене версии FB без резервирования/восстановления (ОДС меналось автоматом, а что еще не шибко далекому человеку надо).
Проблема появилась тогда, когда приложение началось переноситься на D2010.
В некоторых таблицах есть БЛОБ поля (изначально установленные в подтип 1, наверное, из-за того что в эти поля может записываться и текст и бинарные данные).
В D2010 ни компоненты IBX, ни компоненты из dbExpress (оказалось, там теперь есть драйвер для FB) не читают правильно бинарные данные.
В массиве присутствуют нулевые байты (#0). Все чтение заканчивается на первом попавшемся символе нуля. Если в этом поле сохранен текст, то все в порядке - чтение происходит полное. Замена подтипа 1 на подтип 0 БЛОБа ничего не меняет - проблема остается.
Попытки чтения:
Код: Выделить всё
M := TMemoryStream.Create;
TBlobField(IBQuery1.FieldByName('MOD')).SaveToStream(M);
M.Position := 0;
K := M.Size; //для текстов в БЛОБе реальный размер, для бинарных - размер куска БЛОБа до первого символа #0
Memo1.Lines.LoadFromStream(M); //только для отображения при тестировании,
//а, собственно, знач. "К" дает представление о том сколько считано, да и такой код тоже показывает это же значение:
//K := (IBQuery1.FieldByName('MOD') as TBlobField).BlobSize;
M.Free;
Таблица LIBMODS, поле MOD - первые две записи.