![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно работать с BLOB [D7, IB6.x]
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 или вообще непонятно что за файл.