Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > как занести изображение из Image в базу данных


Автор: Sofia56 15.8.2013, 22:01
привет всем)
помогите пожалуйста сделать курсовой!!! плиз...
есть база (создана в парадоксе) в ней есть поле 'kart' в нем хранятся картинки.
добавляю картинку сначало в Image
Код

if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

 и тут возникает проблема..если все остально я заношу в базу так 
Код

with Table4.Fields do
begin
Table4.Edit;
Table4.Insert;
FieldByName('Izdat').AsString:=Trim(Edit1.Text);
FieldByName('Gorod').AsString:=Trim(Edit2.Text);
FieldByName('Adres').AsString:=Trim(Edit3.Text);
FieldByName('El_ad').AsString:=Trim(Edit4.Text);
FieldByName('Index').AsInteger:=StrToInt(Edit5.Text);
Table4.Post;

то как сохранить картинку в базу я не знаю.подскажите пожалуйста буду очень признательна

Автор: Poseidon 16.8.2013, 13:14
Картинки нужно сохранять как BLOB поля, при этом, для большинства баз, сначала необходимо создать запись, а потом уже обновлением этой записи внести в нее картинку. На сколько я помню Table после Post остается на добавленной записи, поэтому тебе всего-лишь нужно опять открыть базу для обновления (Edit) и загнать туда картинку.

Можно еще попробовать вот так:
Код

(Table4.FieldByName('Picture') as TBlobField).LoadFromFile(OpenPictureDialog1.FileName);

или вот так
Код

Image1.Picture.Bitmap.Assign(TBlobField(Table4.FieldByName('Picture')));


Все зависит от того, какая используется БД.

Автор: Данкинг 16.8.2013, 17:59
Код

procedure FileToBlob(BlobField: TField; FileName: string);
var S : TStream;
    FileS : TFileStream;
begin
  S:=BlobField.DataSet.CreateBlobStream(BlobField, bmReadWrite);
  FileS:=TFileStream.Create(FileName, fmOpenRead);
  try
    S.CopyFrom(FileS, FileS.Size);
  finally
    FileS.Free;
    S.Free;
  end;
end;

Автор: Sofia56 16.8.2013, 18:01
к сожалению я понятия не имею что такое BLOB поля. поняла только что в них хранятся музыка, картинки и т.д....
Но что с ними делать я не знаю.как я поняла сначала их нужно создать,а потом объявить...а как это сделать????(((

Автор: Данкинг 16.8.2013, 19:31
Вообще зачем хранить картинки в самой БД? Логичнее оставлять их обычными файлами на винте, а в таблицу вносить ссылки на эти файлы, при необходимости загружая или же открывая дефолтной программой.
Цитата(Sofia56 @  16.8.2013,  19:01 Найти цитируемый пост)
поняла только что в них хранятся музыка, картинки и т.д....

Да любые файлы...
Цитата(Sofia56 @  16.8.2013,  19:01 Найти цитируемый пост)
как я поняла сначала их нужно создать,а потом объявить...

Где и зачем их объявлять?
Цитата(Sofia56 @  16.8.2013,  19:01 Найти цитируемый пост)
а как это сделать????(((

Средствами СУБД.

Автор: Sofia56 16.8.2013, 22:42
программа выдает ошибку "необъявленный идентификатор: 'TBlobField'"
так как тогда быть нужно TBlobField объявлять или нет?

Автор: Sofia56 16.8.2013, 23:06
 
Код

 ps := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(ps);
    SaveToBlob(ps, Form2.Table4.FieldByName('Log'));
  finally
    ps.Free;

пробовала так делать но тогда ругается на SaveToBlob

Автор: Данкинг 16.8.2013, 23:30
Цитата(Sofia56 @  16.8.2013,  23:42 Найти цитируемый пост)
программа выдает ошибку "необъявленный идентификатор: 'TBlobField'"

Где именно?
Цитата(Sofia56 @  17.8.2013,  00:06 Найти цитируемый пост)
но тогда ругается на SaveToBlob 

А процедура SaveToBlob где объявлена?

Автор: Sofia56 16.8.2013, 23:40
заранее знаю что спрошу глупость но где ее объявлять?

Автор: Чучмек 17.8.2013, 04:01
Код

(Table1.FieldByName('Img') as TGraphicField).LoadFromFile;
(Table1.FieldByName('Img') as TGraphicField).LoadFromStream;
(Table1.FieldByName('Img') as TGraphicField).SaveToFile;
(Table1.FieldByName('Img') as TGraphicField).SaveToStream;


Вот простейший пример.
Таблица: img_table.db
Код

---------------------------
|Field Name|Type |Size|Key|
---------------------------
|    Id    |  +  |    | * | (Autoincrement)
--------------------------
|   Name   |  A  | 30 |   | (Alpha)
---------------------------
|   Img    |  G  |    |   | (Graphic)
---------------------------  
    
На форме
    Table1: TTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBImage1: TDBImage;
    Button1: TButton;
Установки
   Table1.TableName = img_table.db;
   Table1.Active = true;
   DataSource1.DataSet = Table1;
   DBGrid1.DataSource = DataSource1;
   DBImage1.DataSource = DataSource1;
   DBImage1.DataField  = Img;
По нажатию кнопки "Добавить" (Button1) открывается диалоговое окно выбора файла. 
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Form2.ShowModal = mrOk then
  begin
    Table1.Insert;
    Table1.FieldByName('Name').AsString:=form2.Edit1.Text;
    (Table1.FieldByName('Img') as TGraphicField).LoadFromFile(Form2.OpenDialog1.FileName);
    Table1.Post;
  end;
end;

Все.



Автор: Данкинг 17.8.2013, 10:31
Цитата(Sofia56 @  17.8.2013,  00:40 Найти цитируемый пост)
заранее знаю что спрошу глупость но где ее объявлять?

В программе. smile 
Кстати, какая СУБД всё же?

Автор: Larry9 24.1.2014, 09:35
ИМХО выше ответили всё верно, не надо пихать мультимедиа файлы в поля БД. Лучше создать ссылки на файлы, а сами файлы хранить отдельно.

Иначе, если возникнет необходимость переноса БД на другой движок, наверняка замучаетесь с изменениями структуры.

Автор: Агрох 24.1.2014, 11:45
Цитата(Sofia56 @  15.8.2013,  23:01 Найти цитируемый пост)
помогите пожалуйста сделать курсовой!!! плиз...


Советы давали как разработчику ПО. А тут надо всего то сделать курсач. У курсача, в отличии от разработки ПО, есть чёткая задача - научиться делать что либо конкретным способом, а не делать то же самое, но самым лучшим образом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)