Delphi 7: как загрузить картинку jpg в базу данных Paradox

5065584

Имею вопрос: как загружать картинку JPG в поле типа BLOB (Graphic или Binary) базы данных Paradox и как её выгружать? Посоветуйте, пожалуйста, источники по этому вопросу, примеры рабочего кода или объясните, как это сделать. Как ни пытался сам - ничего не получается.

kill-still

рассказывай как пытался, на каком месте затык.

5065584

Смотрите:
Я подключил модуль jpeg. Здесь я загружаю jpg из файла в TImage и поле Graphic таблицы
procedure Tterminal.N11Click(Sender: TObject);
begin
if terminal.Open_base.Execute then
begin
card_edit.rphoto.Picture.LoadFromFile(terminal.Open_base.FileName);
stream:=nil;
terminal.base.Edit;
stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmwrite);
card_edit.rphoto.Picture.Graphic.SaveToStream(Stream);
base.FieldByName('isphoto').AsBoolean:=true;
stream.free;
terminal.base.Post;
card_edit.rphoto.Visible:=true;
end;
end;

Здесь Stream - переменная типа TStream. Этот код не выдает ошибки. Картинка правильно отображается в rphoto (TImage кроме того, судя по изменению размера файла .MB картинка в него загрузилась.
А здесь jpg загружается из базы в TImage:
if terminal.base.FieldByName('isphoto').AsBoolean=true then
begin
fcard_edit.rphoto.Visible:=true;
stream:=nil;
Stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmRead);
card_edit.rphoto.Picture.Graphic.LoadFromStream(stream); <------------------ Здесь возникает ошибка
stream.Free;
fcard_edit.Refresh;
end;

Выдается ошибка "Access Violation"
Не понимаю, почему.

Dasar

загрузи blob сначала в память, а уже из памяти грузи картинку.
зы
[телепатия] загрузчик картинки скорее всего хочет делать seek у стрима, а стрим базы такое не умеет

kill-still

вообще в JediLibrary/DevExpress есть аналоги TDBImage (а также гриды) умеющие сами грузить картинки из базы. Я бы советовал не изобретать пылесос/велосипед, если не уверен в своих силах.

5065584

Ээ, позвольте... Но

Stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmRead);

вроде бы именно что грузит blob в память, а

card_edit.rphoto.Picture.Graphic.LoadFromStream(stream);

грузит картинку из памяти. Или я чего-то не понимаю?

Dasar

>вроде бы именно что грузит blob в память, а
в названии функции написано, что она создает стрим, ни о какой загрузке в названии речь не идет

5065584

А как тогда загрузить blob в память?

kill-still

ну попробуй чё-нить вроде

Stream:=terminal.base.CreateBlobStream(terminal.base.FieldByName('photo'bmRead);
LocalStream := TMemoryStream.Create;
LocalStream.CopyFrom(Stream, Stream.Size);
card_edit.rphoto.Picture.Graphic.LoadFromStream(LocalStream)

kill-still

возможно ещё отпозиционировать на начало надо
Stream.Seek(0, soFromBeginning);

5065584

Мда.. Картинка загрузилась в базу, потом выгрузилась, причем произошел сбой - часть картинки есть, часть - зеленые квадратики разных оттенков. К тому же, теперь начал сбоить модуль jpeg... Но все равно, спасибо за советы.

kill-still

проверяй целостность того, что получилось. что лежит в базе и что считалось в стрём.
начинаться должно обязательно на FFD8 а заканчиваться на FFD9 и проверь сколько ты выставил макс. размер блоба в бд.

5065584

А вот ещё вопрос, но уже не о jpeg (я затрахался и теперь гружу bmp): вот такой код - правильный?

procedure Tcard.change_card(CardDataSource:TDataSource;BaseFields:Tfields);
begin
if BaseFields.FieldByName('isphoto').AsBoolean=true then
begin
card.rphoto.DataSource:=CardDataSource;
card.rphoto.DataField:='photo';
card.rphoto.LoadPicture;
end;
card.Refresh;
end;

Я передаю TDataSource как параметр процедуры CardDataSource и присваиваю его card.rphoto.DataSource (TDBImage). Так вот, картинка - не грузится. Хотя такой же код, в котором card.rphoto.DataSource грузится из глобальной переменной - работает. Не подскажете, в чем дело?

kill-still

ты бы ещё сказал бы, каких типов у тебя объекты, а то тут не все телепаты.

kill-still

а датасет у тебя открыт-то?

5065584

ты бы ещё сказал бы, каких типов у тебя объекты, а то тут не все телепаты.

card.rphoto:TDBImage
CardDataSource:TDataSource
BaseFields:Tfields

5065584

У меня в другой форме есть объект SearchQuery:TQuery, который работает - находит записи и даже правильно отображает их в находящемся там же AllCards:TDBGrid. Так вот, я вызываю процедуру

procedure TSearch.allcardsCellClick(Column: TColumn);
begin
card:=Tcard.Create(Application);
card.change_card(SearchQuery.DataSource,SearchQuery.Fields);
end;;

Создается новая форма, в ней правильно отображаются все данные из базы, кроме картинки.

kill-still

а) cоздай на своём Tcard отдельный датасорс, и передавай датасет, или кверю, что там у тебя.
б) AutoDisplay у дбимаджа твоего чему равен?

5065584

AutoDisplay=True, это есть.

5065584

А не подскажет ли кто-нибудь, как форме-родителю (MDIParent) проверить, что его MDIChild закрыт?
Оставить комментарий
Имя или ник:
Комментарий: