Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];

Вниз

Как правильно работать с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
3-62980
ZeroDivide
2003-12-24 09:26
2004.01.20
Где находится tnsnames.ora ?


1-63202
Aleks_S
2004-01-10 04:09
2004.01.20
Компонент в ячейке TStringGrid?


3-62977
Pako
2003-12-24 10:06
2004.01.20
запрос


4-63432
DillerXX
2003-11-15 17:48
2004.01.20
StaticText


1-63095
Unax
2004-01-07 11:15
2004.01.20
Kylix 3





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский