Страница 1 из 1

BLOB. Проблема перехода с Delphi7 на Delphi2010

Добавлено: 26 окт 2012, 11:08
BPach
Есть: 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 БЛОБа ничего не меняет - проблема остается.
Попытки чтения:

Код: Выделить всё

      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;
На всякий случай, может кто заинтересуется проблемой, одну из небольших баз можно взять здесь: http://athenasoft.ru/src/mazada.zip
Таблица LIBMODS, поле MOD - первые две записи.

Re: BLOB. Проблема перехода с Delphi7 на Delphi2010

Добавлено: 26 окт 2012, 16:15
kdv
ODS не меняется "автоматом", для смены ODS нужен b/r. И во время restore можно изменить размер страницы. Кроме того, сейчас базы с страницей 1к работают гораздо медленнее, чем с 4 или 8к.
Все чтение заканчивается на первом попавшемся символе нуля.
значит где-то чтение идет через строку C. Попробую проверить через недельку, не припомню проблем с чтением бинарных данных из блобов.

Re: BLOB. Проблема перехода с Delphi7 на Delphi2010

Добавлено: 26 окт 2012, 20:13
BPach
ODS не меняется "автоматом", для смены ODS нужен b/r
Хм, действительно, версия ODS баз 10.1 (еще с FB 1.5), хотя спокойно работает под FB 2.5.
Что-то где-то мелькнуло по поводу "автоматом", так и застряло в голове.
Размер страницы, конечно меняется по мере возможности.
Чтение байтов из БЛОБ вроде пошло. С применением нового для меня типа переменных в Дельф - RawByteString.
Но хотелось бы разобраться окончательно.

Re: BLOB. Проблема перехода с Delphi7 на Delphi2010

Добавлено: 26 окт 2012, 20:31
kdv
а, впрочем, все и так понятно, раз RawString работает. В Дельфи 2009 и выше все строковые типы уже юникодные. А значит символ 0 уже обрабатывается специфически. Собственно, все.
Про юникод и строки, в каких что можно хранить, советую прочитать книгу Канту
Delphi 2009 Handbook. Если D2009-2010 покупали, она должна у вас быть в электронном виде на members.embarcadero.com.