ЧАстые Вопросы и Ответы
Модераторы: kdv, CyberMax
-
Hadroran
- Сообщения: 39
- Зарегистрирован: 22 фев 2005, 10:23
Сообщение
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. кстати. вопрос решается элементарно, при минимальных навыках программирования.
-
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. Так что...