Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно работать с BLOB [D7, IB6.x]


Страницы:   1 2

Igorr ©   (2003-12-22 16:40:00) 

Такая цитата на ibase.ru

procedure TForm1.Button1Click(Sender: TObject);
var B: TIBBlobStream;
begin
B:=IBDataSet1.CreateBlobStream(IBDataSet1.FieldByName("BLB") as
TBlobField, bmRead);
B.SaveToFile("c:\blob.bin");
B.Free;
end;

Создаю у себя аналогичный код:

B:=IBQo.CreateBlobStream(IBQo.FieldByName(GetNParam(paParams,0)) as
TBlobField, bmRead);
B.SaveToFile(GetNParam(paParams,1));
B.Free;

IBQo - IBQuery
Ругается Incompatible types TIBBlobStream and TStream
Если делаю B:TStreem, то SaveToFile не работает. Как же правильно прочитать
из Blob


Igorr   (2003-12-22 19:00:00) [1]

Все получилось. Большое спасибо за помощь


Sandman25   (2003-12-22 18:48:00) [2]

bmRead замените на bmWrite!
А еще лучше всегда указывайте bmReadWrite, если не знаете, где читаете, а где записываете.

Все, я скоро ухожу.


Igorr   (2003-12-22 18:46:00) [3]

Что-то я сомневаюсь в правильности записи
Ведь CopyFrom(S, S.Size) - S из базы, оно пустое и что же мы записываем в базу?

procedure TForm1.Button1Click(Sender: TObject);
var B: TIBBlobStream;
S:TStream;
begin
IBTable1.Edit;
with TFileStream.Create("d:\BID-ZAk.xls", fmOpenRead ) do begin
try
S:=IBTable1.CreateBlobStream(IBTable1.FieldByName("BL") as TBlobField, bmRead);
try
CopyFrom(S, S.Size);
except
ShowMessage("Неудача");
end;
S.Free;
finally
Free;
end;
end;
IBTable1.Post;
end;


Sandman25   (2003-12-22 18:39:00) [4]

А FieldByName("BL").IsNull = true?

Попробуйте еще сделать Position := 0 перед сохранением.


Igorr   (2003-12-22 18:38:00) [5]

Не помогает.
После S:=IBTable1.CreateBlobStream(IBTable1.FieldByName("BL") as TBlobField, bmRead);

S=() S.Size=0


Sandman25   (2003-12-22 18:35:00) [6]

bmWrite неправильно. Вы же из него читаете. Установите bmRead.

Кстати, а что возвращало CreateBlobStream().ClassName?
Мне просто интересно. Проверить не могу - с IB я не работаю. Я думал, что по аналогии с другими компонентами будет возвращен соответствующий тип, а именно TIBBlob...


Igorr   (2003-12-22 18:31:00) [7]

[17]
Так вроде что-то записало.
А теперь 2-я часть марлизонского балета: хочу прочитать и записать в другой файл. делаю по аналогии. Но в итоги получаю новый файл 0 длины. Что не так?

procedure TForm1.Button2Click(Sender: TObject);
var B: TIBBlobStream;
S:TStream;
begin
with TFileStream.Create(Edit1.Text, fmCreate) do begin
try
S:=IBTable1.CreateBlobStream(IBTable1.FieldByName("BL") as TBlobField, bmWrite);
try
Write(S, S.Size);
finally
S.Free;
end;
finally
Free;
end;
end;
end;


Sandman25   (2003-12-22 18:03:00) [8]

В-общем, хватит LoadFromFile Искать... Можно так сделать:
with TFileStream.Create(...) do
try
Stream := IBQo.CreateBlobStream(..);
try
CopyFrom(Stream, Stream.Size);
finally
Stream.Free;
end;
finally
Free;
end;


Sandman25   (2003-12-22 17:59:00) [9]

[15] Igorr (22.12.03 17:56)

То есть Вы выполнили [14] и там было TStream???
Странно... Уверены?

Если так, то придется перегонять данные в TMemoryStream или записывать самому. У TStream нет метода SaveToFile...


Igorr   (2003-12-22 17:56:00) [10]

[14] так я же не спорю. CreateBlobStream действительно возвращает TStream. Я просто спрашиваю как дальше с этим работать?


Sandman25   (2003-12-22 17:55:00) [11]

А еще лучше посмотрите значение
IBQo.CreateBlobStream(...).ClassName


Igorr   (2003-12-22 17:54:00) [12]

Пробую с TIBTable (раньше пробовал с TIBQuery). А какой должен быть?


Sandman25   (2003-12-22 17:53:00) [13]

[11] Igorr (22.12.03 17:52)

Какой тип у IBQo?


Igorr   (2003-12-22 17:52:00) [14]

[9] В предложенном варианте внутрь if вообще не заходит. Если без if а сразу IBStream := Stream as TIBBlobStream; то пишет Invalid class typecast


Sandman25   (2003-12-22 17:46:00) [15]

Я тут немного с C спутал.
Вместо (TIBBlobStream)B надо писать TIBBlobStream(B).
Извините.

Или еще можно вот так

TStream(B) := IBQo.CreatBlobStream...


Sandman25   (2003-12-22 17:42:00) [16]

TIBBlobStream является наследником TStream.
TIBQuery.CreateBLobStream фактически возвращает TIBBlobStream, но формально возвращает TStream (для совместимости).
Более корректно будет так:
var
Stream: TStream;
IBStream: TIBBlobStream;

begin
Stream := IBQo.CreateBlobStream...
if Stream is TIBBlobStream then
begin
IBStream := Stream as TIBBlobStream;
IBStream.SaveToFile...
...
end;

Можете еще посмотреть операторы is и as в delphi help.


Igorr   (2003-12-22 17:34:00) [17]

[6] Прочитал еще раз 1. Не понял. Можно ли разъяснить. Что значит B := (TIBBlobStream)IBQo.CreateBlobStream(...) Как понимать (TIBBlobStream)


MV   (2003-12-22 17:31:00) [18]

Тогда .SaveToFile


Sandman25   (2003-12-22 17:30:00) [19]

[5] Igorr (22.12.03 17:28)

Когда надоест мучиться, прочитайте [1]


Igorr   (2003-12-22 17:28:00) [20]

Но я не знаю зараннее, что у меня будет за файл: может картинка, может word, excell или вообще непонятно что за файл.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо