Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

Как правильно работать с BLOB   Найти похожие ветки 

 
Igorr   (2003-12-22 16:40) [0]

Такая цитата на 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


 
Sandman25 ©   (2003-12-22 16:41) [1]

B := (TIBBlobStream)IBQo.CreateBlobStream(...)


 
JibSkeart ©   (2003-12-22 16:42) [2]

воспользуйся поиском сдесь уже были подобные темы


 
Igorr   (2003-12-22 17:07) [3]

Нашел ответы тут, а там ве то же что я и знал. И все таки у кого-то есть пример, как это правильно делать (сохранять из файла в Blob и восстанавливать из Blob в файл)


 
MV   (2003-12-22 17:24) [4]

Ну, например, грузим картинку в Image1 из поля Map текущей записи:

var S : TStream;
begin
// Загрузка картинки
if not DataSet.FieldByName("Map").IsNull then begin
S := DataSet.CreateBlobStream(
DataSet.FieldByName("Map"), bmReadWrite);
try
try
Image1.Picture.Bitmap.LoadFromStream(S);
except
on E : Exception do ShowMessage("Ошибка при загрузке картинки"#13+
E.Message);
end
finally
S.Free;
end
end;


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

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


 
Sandman25 ©   (2003-12-22 17:30) [6]

[5] Igorr (22.12.03 17:28)

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


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

Тогда .SaveToFile


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

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


 
Sandman25 ©   (2003-12-22 17:42) [9]

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.


 
Sandman25 ©   (2003-12-22 17:46) [10]

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

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

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


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

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


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

[11] Igorr (22.12.03 17:52)

Какой тип у IBQo?


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

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


 
Sandman25 ©   (2003-12-22 17:55) [14]

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


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

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


 
Sandman25 ©   (2003-12-22 17:59) [16]

[15] Igorr (22.12.03 17:56)

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

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


 
Sandman25 ©   (2003-12-22 18:03) [17]

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


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

[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:35) [19]

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

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


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

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

S=() S.Size=0


 
Sandman25 ©   (2003-12-22 18:39) [21]

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

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


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

Что-то я сомневаюсь в правильности записи
Ведь 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:48) [23]

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.01.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.028 c
1-63232
serg128
2004-01-09 12:49
2004.01.20
Как спрятать процесс в Win98?


1-63143
LLL
2004-01-06 03:22
2004.01.20
по типу TCheckListBox


3-62988
loki128
2003-12-23 13:50
2004.01.20
Внутреннее соединение таблиц


3-63014
vlgrig1961
2003-12-23 08:30
2004.01.20
В чем разница у Оракла между табл. sys.all_tables и sys.dba_table


1-63199
ИМХО
2004-01-10 05:34
2004.01.20
Размер файла FileSize