Как правильно использовать поле blob ?
От: Andrey01  
Дата: 17.05.03 16:57
Оценка:
Как корректно использовать поле blob для заполнения его данными ? (Delphi)
К примеру как загруженное изображение сохранить в поле blob, а затем отобразить его в программе (через TImage?). (изображение не обязательно будет bmp, может быть и jpg, gif, pcx и т.д.)
это поле blob должно потом считывается из php-скрипта. mysql

18.05.03 02:37: Перенесено модератором из 'Базы данных' — _MM_
Re: Как правильно использовать поле blob ?
От: _MarlboroMan_ Россия  
Дата: 17.05.03 22:30
Оценка:
Здравствуйте, Andrey01, Вы писали:

A>Как корректно использовать поле blob для заполнения его данными ? (Delphi)

A>К примеру как загруженное изображение сохранить в поле blob, а затем отобразить его в программе (через TImage?). (изображение не обязательно будет bmp, может быть и jpg, gif, pcx и т.д.)
A>это поле blob должно потом считывается из php-скрипта. mysql

RTFM:

TBlobField.SaveToStream
Saves the contents of the BLOB field to a stream.
procedure SaveToStream(Stream: TStream);

Description

Use SaveToStream to copy the contents of a BLOB field to a stream. Specify the name of the stream to which the field’
s value is saved as the value of the Stream parameter.

Note: The Stream parameter is typically not a BLOB stream. BLOB streams (returned by the dataset’s CreateBlobStream method) provide a completely separate mechanism for streaming data from a BLOB field.

var
  MS: TMemoryStream;
begin
  MS := TMemoryStream.Create;
  try
    SQLDataSet1Images.SaveToStream(MS);
    Image1.Picture.Bitmap.LoadFromStream(MS);
  finally
    MS.Free;
  end;
end;



TBlobField.LoadFromStream

Loads BLOB data from a stream into the field.
procedure LoadFromStream(Stream: TStream);

Description

Use LoadFromStream to copy the contents of a stream into the BLOB field. Specify the stream from which the field’s value is copied as the value of the Stream parameter.

Note: The Stream parameter is typically not a BLOB stream. BLOB streams (returned by the dataset’s CreateBlobStream method) provide a completely separate mechanism for streaming data into a BLOB field.

var

  MS: TMemoryStream;
begin
  if not (ClientDataSet1.State in [dsInsert, dsEdit]) then
    ClientDataSet1.Insert;
  MS := TMemoryStream.Create();
  try
    Image1.Picture.Bitmap.SaveToStream(MS);
    ClientDataSet1Images.LoadFromStream(MS);
  finally
    MS.Free;
  end;
  ClientDataSet1.Post;
end;



TDataSet.CreateBlobStream + смотри соответствующий экзампл.

Provides the interface for a method that creates a blob stream for a Binary large object (BLOB) field in the dataset.
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; virtual;

Description

Call CreateBlobStream to obtain a stream for reading and writing the value of the field specified by the Field parameter. The Mode parameter indicates whether the stream will be used for reading the field’s value (bmRead), writing the field’s value (bmWrite), or modifying the field’s value (bmReadWrite).

Blob streams are created in a specific mode for a specific field on a specific record. Applications create a new blob stream every time the record in the dataset changes: do not reuse an existing blob stream.

As implemented in TDataSet, CreateBlobStream always returns nil. Descendants of TDataSet override this method to create the TStream descendant that reads and writes BLOB data in the format that dataset type uses to store BLOB fields.

Tip: It is preferable to call CreateBlobStream rather than creating a blob stream directly in code. This ensures that the stream is appropriate to the dataset, and may also ensure that datasets that do not always store BLOB data in memory fetch the blob data before creating the stream.
... << RSDN@Home 1.0 beta 6a silent>>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[2]: Как правильно использовать поле blob ?
От: Andrey01  
Дата: 18.05.03 18:59
Оценка:
спасибо. отлично работает. но проблема в том, что работает только с Bitmap а другие изображения как -то сжимает в своём формате, с некоторыми совсем не работает. А хотеось бы чтобы они оставались в исходном виде.

Сохрание в базу изображения идёт так:
  AdoTable1.Edit;
  AdoTable1Ole.LoadFromFile(OpenDialog1.FileName); //загружаем картинку
  AdoTable1.Post;

а чтение:
  AdoTable1Ole.SaveToFile('temp.gif');
  Image1.Picture.LoadFromFile('temp.gif');
  DeleteFile('temp.gif');

правильно ли это? не будет ли программа убивать слишком много ресурсов на создавание/удаление временных файлов? Можно ли загрузить в изображение из поля в файл через поток Stream, (только не Image.Picture.Bitmap.LoadFromStream) ??

скажем, сделать

  AdoTable1Ole.SaveToStream(MemoryStream);
  Image ... ...LoadFromStream(MemoryStream);  ??? // может использовать какой-то другой компонент для работы с изображениями (требуется gif jpeg pcx png ...)?
Re[3]: Как правильно использовать поле blob ?
От: oleg_v Украина www.lot.kharkov.ua
Дата: 19.05.03 09:09
Оценка:
Здравствуйте, Andrey01


Через stream будет правильнее. С временными файлами могут быть проблеммы.
... << RSDN@Home 1.0 beta 7a >>
Re[3]: Как правильно использовать поле blob ?
От: Olga____  
Дата: 23.08.03 08:56
Оценка:
Здравствуйте, Andrey01, Вы писали:

A>
A>  AdoTable1.Edit;
A>  AdoTable1Ole.LoadFromFile(OpenDialog1.FileName); //загружаем картинку
A>  AdoTable1.Post;
A>

Помогите, пожалуйста, у меня тоже самое не работает, с чем это может быть связано? Правда я сохраняю не картинку, а документ *.doc. Если открыть потом базу в Access, там появляются какие-то "двоичные данные".
Спасибо.
Re[4]: Как правильно использовать поле blob ?
От: Anatoly Podgoretsky Эстония http://www.podgoretsky.com
Дата: 23.08.03 11:52
Оценка:
From: Olga____

A> AdoTable1.Edit;

A> AdoTable1Ole.LoadFromFile(OpenDialog1.FileName); //загружаем картинку
A> AdoTable1.Post;

Помогите, пожалуйста, у меня тоже самое не работает, с чем это может быть связано? Правда я сохраняю не картинку, а документ *.doc. Если открыть потом базу в Access, там появляются какие-то "двоичные данные".

Оценить


Оно и есть двоичные, это не текстовый файл.
Posted via RSDN NNTP Server 1.7 beta
Re[5]: Как правильно использовать поле blob ?
От: Olga____  
Дата: 23.08.03 12:14
Оценка:
Здравствуйте, Anatoly Podgoretsky, Вы писали:


AP>Оно и есть двоичные, это не текстовый файл.


Дело не в этом. Просто если "Добавить объект" в Access-е, то в таблице написань потом "Документ Microsoft Word", а после добавления в Delphi, написано "Двоичные данные", и документ извлечь никак нельзя. Он что-то не то туда заносит? Или так и должно быть?
Спабибо.
Re[6]: Как правильно использовать поле blob ?
От: xrenok  
Дата: 06.05.04 12:45
Оценка:
Существует ли ответ на вопрос Olga____ ?
У меня аналогичная проблема с хранением документов Excel в Blob-полях.
Все усложняется необходимостью работы с базой данных как из Access так и из Delphi.
Re[7]: Как правильно использовать поле blob ?
От: akasoft Россия  
Дата: 07.05.04 15:09
Оценка:
Здравствуйте, xrenok, Вы писали:

X>Существует ли ответ на вопрос Olga____ ?


_MM_ выше по теме уже дал ответ.

Один из способов — сохранять блоб в файл используя механизмы TStream, и потом открывать его в Word или Excel.
Вполне себе работает.

В справке Access описаны ограничения на блоб поля для .mdb. Ну а "двоичными данными" это вполне правильно называется, там же не plain text, а самый что ни на есть binary data...
... << RSDN@Home 1.1.3 beta 2 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.