Файл в BLOB

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Файл в BLOB

Сообщение Hadroran » 06 апр 2006, 10:20

При компиляции кода

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

 IBDataSet1.Edit;
 B:=IBDataSet1.CreateBlobStream(IBDataSet1.FieldByName('BLB') as TBlobField, bmWrite);
 B.LoadFromFile('c:\blob.bin');
 B.Free;
 IBDataSet1.Post;
появляется ошибка несоответствия типов TIBBlobStream и TStream.
В чем причина?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 апр 2006, 10:32

где появляется? переменная B как объявлена?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 апр 2006, 11:20

понял. можно было объяснить словами, а не своим кодом.
Значит так. Смотрим в исходник. IBDataSet.CreateBlobStream теперь (в IB X .09, предыдущие мне уже смотреть негде) почему-то возвращает результат как IBDSBlobStream. Зачем это сделано (пока вижу что при каждом открытии блоба он "кэшируется", то есть попадает в список открытых блобов датасета), не знаю, разберусь потом. В результате оба этих потока унаследованы от TStream, и разумеется, несовместимы. Но - у IBDSBlobstream нет свойств save, load и т.п.

Поэтому, сделав примитивный поиск в исходнике, делаем вот что:
if IBDataSet.FieldByName('B').isBlob then
(IBDataSet.FieldByName('B') as TBlobField).SaveToFile...

и т.п.

когда перестал работать старый способ (в какой версии IBX), я не знаю.

p.s. кстати. вопрос решается элементарно, при минимальных навыках программирования.

Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Сообщение Hadroran » 06 апр 2006, 11:49

Обалдеть... :D

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 апр 2006, 13:24

в ньюсгрупе на gmane провели расследование, оказалось, что мой оригинальный код работает в IBX 4.42, и уже не работает в 4.63.

предлагаю поменять на

IBDataSet1.FieldByName('BLB') as TBlobField).SaveToFile('c:\blob.bin');

и

IBDataSet1.Edit;
(IBDataSet1.FieldByName('BLB') as TBlobField).LoadFromFile('c:\blob.bin');
IBDataSet1.Post;

пока у меня есть смутное подозрение (подтверждается просмотром исходников), что в этом случае блобы будут "кэшироваться" до тех пор, пока датасет не закрыт. У IBCustomDataSet есть внутренний BlobStreamList, в который складываются блобы, открываемые в createblobstream. Так что...

Ответить