Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Delphi + изображение в базе Access

Автор: ITProf
Дата сообщения: 08.02.2005 16:52
Есть база, сделанная в Access XP. Есть там поле FOTO типа OLE. В это поле средствами Access'a внедрены фотографии разных типов и параметров (BMP и JPG).

В Delphi 7 есть DataModule в котором ADOConnection -> ADOTable -> DataSource настроены на эту базу. На главной форме стоит компонент DBImage, который настроен на поле фото. Если запускать приложение с деактивированым компонентом DBImage, то все работает нормально (текстовые, цифровые данные с других полей нормально читаются), но как только активируешь компонент DBImage (вернее, как только он пытается прочитать данные из поля Foto) сразу же вылетает ошибка:

Project sc.exe raised exception class EInvalidGraphic with message 'Bitmap image is not valid'. Process stopped. Use Step or Run to continue.

Что я делаю не так?

P.S. Я подозреваю, что проблема в несовподении типов данных. В Access это поле имеет тип OLE, а компонент DBImage читает данные с BLOB полей... Или это одно и тоже? Как решить этот трабл?
Автор: YurikGL
Дата сообщения: 08.02.2005 16:54
Если не ошибаюсь, DBImage не умеет читать jpg

Советую попробовать записать в пустую базу через dbimage какой-нибудь рисунок в базу, потом попробовать его считать ассессом и самим dbimage-м. Это поможет однозначно определить является ли ошибка следсвием несовпадения данных
Автор: ITProf
Дата сообщения: 08.02.2005 17:14
Хорошо, как тогда внести изображение в базу?
Хотелось бы следующим образом: нажимаем кнопочку -> открывается стандартное окно выбора файла -> выбираю изображение -> оно появляется на форме -> нажимаю кнопочку сохранить -> изображение записывается в базу.

Как это реализовать? Через какие компоненты?

Добавлено:
YurikGL

Спасибо за совет.

Удалил из базы все изображения. Потом вставил в DBImage фото из клипбоарда и записал его в базу. Изображение видно отлично, ошибок больше нет. В Access теперь в поле FOTO пишет "двоичные данные". Из чего следует, что догадка была верна - поле OLE и BLOB несовместимы.

НО! Возникает другой вопрос. Как теперь средствами Access'a вставить фото? Или придется писать еще одну прогу - для заполнения базы? ;(
Автор: MrZeRo
Дата сообщения: 08.02.2005 18:23
Может, немного не в тему, но я тоже сталкивался с подобными проблемами. Однако после того, как немного поработал в этом направлении остановился на том варианте, чтобы графические файлы хранить вообще отдельно от базы данных Access, т.е. в отдельных файлах. На конферениях по Access в свое время сошлись во мнениях, что так лучше, так как Access плохо работает в OLE-объектами, в частности, при наполнении базы начинается непропорциональное увеличение ее размеров, падение производительности, глюки и т.д. В базе я храню только имена файлов. Показывать картинки можно как угодно потом - это не проблема.
Автор: YurikGL
Дата сообщения: 08.02.2005 22:12
>НО! Возникает другой вопрос. Как теперь средствами Access'a вставить фото? Или
>придется писать еще одну прогу - для заполнения базы? ;(

Могу предположить лишь написать программу конвертор т.е. в твоем ole-поле все равно где-то хранится растр рисунка и его заголовок. Можно попробовать поработать с полем как с двоичными данными и вырезать все лишнее. Оставлять только сам рисунок.
Кстати, предположительно там хранится ссылка на COM-интерфейс программы просмоторщика.
Вообще, посмотри, что это ole-поле из себя в blob-е представляет.
Автор: ITProf
Дата сообщения: 09.02.2005 16:19
YurikGL

OLE явно отпадает, т.к. на самом деле очень сильно увеличивается размер базы (для примера после вставки в базу размером в несколько KB рисунка BMP размером 100 Kb, размер базы стал более 9 MB!).

MrZeRo
Хорошо, допустим в базе я буду хранить ссылки на изображения, а в проге отображать их через компонент "Image". Как тогда без участия компонента "DBImage" записать это изображение в базу? Или придется ставить на форму этот компонент и делать его невидимым?
Автор: MrZeRo
Дата сообщения: 09.02.2005 17:34
ITProf

Цитата:
Как тогда без участия компонента "DBImage" записать это изображение в базу?

Да файл просто забросить в каталог, а в базе прописать ссылку на него. Перед записью можно все файлы преобразовывать, например, в .jpg, чтобы много места не занимали.
Автор: ITProf
Дата сообщения: 09.02.2005 17:54
MrZeRo


Цитата:
Да файл просто забросить в каталог, а в базе прописать ссылку на него. Перед записью можно все файлы преобразовывать, например, в .jpg, чтобы много места не занимали.


Так это понятно. Я имел ввиду другое.
Пример:
Лежит в каталоге файл 1.jpg
В программе я через стандартный диалог выбираю этот файл. Он отображается в компоненте "Image". Как теперь это изображение записать в базу? Ведь у меня на форме нет компонента "DBImage", через который это можно сделать... Или можно обойтись без этого компонента?
Автор: MrZeRo
Дата сообщения: 10.02.2005 09:40

Цитата:
Лежит в каталоге файл 1.jpg


Цитата:
Как теперь это изображение записать в базу?

"Записать в каталог" и "записать в базу" - это одно и то же! Я предлагал файлы хранить в отдельных файлах, а не в базе, в базе только информация о том, где лежит файл.
А чтобы показывать через DBImage ...
Можно создать вычисляемое поле, туда всовывать содержимое файлов, а потом показывать его через DBImage, но это не очень хороший вариант, так как программе придется для всего DataSet шарить по файлам и закачивать их, что не очень производительно. Лучше показывать картинку только для текущей записи через TImage. Реализовать можно как угодно. Например, поставить таймер, и когда пользователь остановился на какой-то записи, через 2 (1, 0.5, ...) сек. загрузить и показать картинку. При дальнейшей прокрутке картинку убрать.
Вариантов много, решай сам.
Автор: Ailia
Дата сообщения: 08.08.2006 09:15
Как вставить фото в базу, чтобы у каждого человека была своя фотка? Помогите, пожалуйста!!!
Автор: RedPromo
Дата сообщения: 08.08.2006 22:46
А можно базу вобще не трогать. Можно реализовать так у каждого элемента есть уникальный идентификатор на основе него генерится имя каталога. Отдельный класс который отвечает за то что находится в каталоге. Я еще примутил xml с описанием файлов и перечнем их. Передал в класс уникальный идентификатор, путь где располагается каталоги с рисунками, и получи список файлов и их описание.
Автор: hofa
Дата сообщения: 03.12.2006 23:32
Ailia

В таблице заводишь поле для хранения изображения, условно IMG.
Подключаешь эту таблицу из делфей, условно к ADOTable1 предварительно положив ADOTable1 на форму (Form1).

Ложишь на форму (Form1) OpenPictureDialog (OpenPic). Две кнопки (btn_loadimg и btn_delimg).. В скобках написаны как у меня названы эти компоненты.

//Процедура добавления рисунка в базу
procedure TForm1.btn_loadimgClick(Sender: TObject);
begin
if not OpenPic.Execute then exit;
    Form1.ADOTable1.Edit;
TBlobField(Form1.ADOTable1.FieldByName('IMG')).LoadFromFile(OpenPic.FileName);
    Form1.ADOTable1.Post;
end;

//Процедура удаления рисунка из базы
procedure TForm1.btn_delimgClick(Sender: TObject);
begin
Form1.ADOTable1.Edit;
Form1.ADOTable1.FieldByName('IMG').Clear;
Form1.ADOTable1.Post;
end;


Успехов.
Автор: filos
Дата сообщения: 04.12.2006 19:43
Я что-то не понял. А если хранить изображения в BLOB поле непропорциональное увеличение базы наблюдается или нет? Да и решение с картинками в отдельной папке конечно хорошее, но не всегда подходящее, так как всетаки иногда требуется держать все данные в одной базе (одном файле)
Автор: hofa
Дата сообщения: 04.12.2006 20:26
filos

Если брать ms access то я непропорционального увеличения не наблюдал, по крайней мере не на много...
Главное делать сжатие и восстановление средствами jro
На эту тему в инете очень много нформации, в частноти и в этом форуме.
И не забывать, что стандартный dbimage в дельфях без плясок с бубном отображает только bmp, но есть компоненты, к тому же бесплатные, которые отбражают основные да и соблюдают пропорцию.

Успехов

Страницы: 1

Предыдущая тема: BCB 6.0 + Indy 10


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.