Текущий архив: 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.49 MB
Время: 0.009 c