База SQLite - blob в Timage и обратно

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

База SQLite - blob в Timage и обратно

Сообщение maser »

Пожалуйста научите неопытного начинающего программиста как организовать сие действие.
Есть база SQLite, в которой в одной из таблиц есть blob-поле с картинкой (jpg). Нужно взять картинку из базы и поместить её в Timage.
Так же интересует обратная процедура - запись картинки в blob-поле базы. Сам осилить не могу что-то. Понял только, что надо использовать stream, а как это в коде организовать не знаю.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

maser
Есть специальный компонент - TDBImage. Назначаете ему соответствующее поле и любуетесь картинками.
maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

Сообщение maser »

Vadim, спасибо за совет, но меня интересует именно тот вариант, который я описал выше. Можно и с DBImage вместо . Я видел коды под делфи, а под лазарь не могу найти подглядеть, т.к. те не идут.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

maser
Каким компонентом пользуетесь для изъятия данных из базы?
Аватара пользователя
grigoreo
постоялец
Сообщения: 195
Зарегистрирован: 10.03.2009 14:43:43
Откуда: С нашей Раши

Сообщение grigoreo »

maser писал(а):Пожалуйста научите неопытного начинающего программиста как организовать сие действие.
Есть база SQLite, в которой в одной из таблиц есть blob-поле с картинкой (jpg). Нужно взять картинку из базы и поместить её в Timage.
Так же интересует обратная процедура - запись картинки в blob-поле базы. Сам осилить не могу что-то. Понял только, что надо использовать stream, а как это в коде организовать не знаю.


именно с SQL lite не скажу но предполагаю что по анологии читаешь содержимое блоб поля в MemoryStream а из него в свой TImage...
maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

Сообщение maser »

Vadim писал(а):Каким компонентом пользуетесь для изъятия данных из базы?

SQLQuery.
к примеру:

Код: Выделить всё

SQLQuery1.Active:=false;
  SQLQuery1.SQL.Text:='select * From Rubrics';
  SQLQuery1.Active:=true;

  // Заполнение ComboBox8
  Combobox8.Clear;
  while not SQLQuery1.EOF do     // пока не дошел до конца столбца...
   begin
    ComboBox8.Items.Add(SQLQuery1.FieldByName('NAME').Value);   //заполнение списка ComboBox8
    SQLQuery1.Next;   // переход ниже по столбцу
   end;
  SQLQuery1.First; // переход на первую строку
  Combobox8.Items[0];   // переход на нулевую строку


Как быть с blob полем не знаю.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Код: Выделить всё

var
  bst: TStream;
begin
  bst := SQLQuery1.CreateBlobStream(SQLQuery1.FieldByName('Photo'), bmRead);
  Image1.Picture.Jpeg.LoadFromStream(bst);
  bst.Free;
maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

Сообщение maser »

v-t-l, СПАСИБО! То что надо. Работает!
одно не понятно мне: что есть "bmRead"?

теперь попробую решить обратную задачу: запись в blob-поле из Timage.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

maser писал(а):что есть "bmRead"?

Создаётся поток "Только для чтения".
maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

Сообщение maser »

Vadim, понятно.

для полного раскрытия темы продолжу:
попытка записать содержимое картинки в Blob-поле SQLite:

Код: Выделить всё

...
var bm: TMemorystream;
...
bm:=TMemorystream.Create;
Image2.Picture.Jpeg.SaveToStream(bm);
bm.Position:=0;
....{тут несколько операций проверки условий и загрузка таблицы}
(SQLQuery1.fieldbyname('Photo') as TBlobField).LoadFromStream(bm); {здесь запинается}
bm.Free;
...     


Не может выполнить запись в базу.
Что не так?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

SQLQuery1 - у этого компонента должно быть заполнено поле UpdateSQL для модификации существующей записи или InsertSQL, для всртавки новой записи. Там должны быть соответствующие SQL-команды.
На будущее. Если у Вас выскакивает какая-нибудь ошибка - пишите её текст сюда, а то похоже практической телепатией тут никто не владеет и что такое "запинается" ( или прочие аналогичные гиперинформативные термины) никто без Ваших пояснений понять не сможет. И следовательно, невозможно Вам оказать помощь. Хорошо? ;)
maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

Сообщение maser »

Модификации записей других типов, кроме blob происходят без проблем. А что надо писать в полях UpdateSQL и InsertSQL? Там сейчас пусто.

"Уведомление об исключении отладчика": Project такой-то raised exception class 'EDatabaseError' with message: SQLQuery1: Operation not allowed, dataset "SQLQuery1" is not in edit or insert state.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Код: Выделить всё

SQLQuery1.Edit;
...
maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

Сообщение maser »

v-t-l писал(а):SQLQuery1.Edit;

помогло в плане сообщения ошибки. Теперь все делает без сообщения ошибки, но в blob-поле ничего не записывает. :?
поробовал сохранить содержимое bm в файл - все получается, т.е. bm содержит нужную информацию.
maser
новенький
Сообщения: 20
Зарегистрирован: 13.01.2011 10:42:25
Откуда: Волгодонск

Сообщение maser »

Не понятно, почему не записывает в базу. Код вроде правильный, в базе тоже все вроде путем прописано. Глюк?
Ответить