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

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

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

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

Сообщение maser » 01.02.2011 16:15:14

Вот такой вариант попробовал:
Код: Выделить всё
procedure TForm1.Button11Click(Sender: TObject);
var bm: TMemorystream;
    h, w, i: integer;
    d:Pchar;
    s:string;
begin
// Добавление новой строки
  if LabeledEdit15.Text<>'' then  //проверка ввода наименования
        begin
         Image2.Picture.Jpeg.GetSize(w,h); //измерение картинки
         if (w<>0) or (h<>0) then  // проверка наличия картинки
          if (w>64) and (h>64) and (w<640) and (h<480)  then  // проверка правила размера картинки
            begin
              bm:=TMemorystream.Create;
              Image2.Picture.Jpeg.SaveToStream(bm);
              bm.Position:=0;
              for i := 1 to bm.Size do
               begin
                 bm.Read(d, 1);
                 s := s + d;
               end;
            end
            else
            begin
             Label27.Visible:=true;
             s:='';
            end
           else s:='';

           // РАБОТА С БАЗОЙ
          SQLQuery1.Active:=false;
          SQLQuery1.SQL.Text:='insert into Tourizm (NAME, Note, Photo, Sinonim) values (:Name, :Note, :Photo, :Sinonim)';
          SQLQuery1.Params.ParamByName('Name').AsString:=LabeledEdit15.Text;
          SQLQuery1.Params.ParamByName('Note').AsString:=Memo1.Text;
          SQLQuery1.Params.ParamByName('Photo').AsBlob:=s;
          SQLQuery1.Params.ParamByName('Sinonim').AsString:=LabeledEdit14.Text;
          SQLQuery1.ExecSQL; 
          SQLTransaction1.Commit;

          bm.Free;
          s:='';
          button28.Click; //Обновление
          Label18.Visible:=false;
          Label27.Visible:=false;
         end
  else Label18.Visible:=true; //отображение сообщения
end;                 


т.е. записал поток в переменную string посимвольно, а затем через params внес в базу как blob.
Запись делает, но прочитать данное поле не получается (по крайней мере как картинку).
maser
новенький
 
Сообщения: 20
Зарегистрирован: 13.01.2011 11:42:25
Откуда: Волгодонск

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

Сообщение v-t-l » 01.02.2011 18:10:03

А так не работает?
Код: Выделить всё
var bst: TStream;
begin
  SQLQuery1.Edit;
  bst := SQLQuery1.CreateBlobStream(SQLQuery1.FieldByName('Photo'), bmWrite);
  Image1.Picture.Jpeg.SaveToStream(bst);
  bst.Free;
  SQLQuery1.Post;
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение maser » 02.02.2011 10:31:47

v-t-l , не работает. Я только не пойму как данный код может записать поток в blob-поле базы. Он скорее читает из базы. Или я что-то не догоняю? :roll:
maser
новенький
 
Сообщения: 20
Зарегистрирован: 13.01.2011 11:42:25
Откуда: Волгодонск

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

Сообщение alexsa » 02.06.2011 23:44:06

maser писал(а):т.е. записал поток в переменную string посимвольно, а затем через params внес в базу как blob.
Запись делает, но прочитать данное поле не получается (по крайней мере как картинку).


Потому и не получается прочитать с базы, потому что нужно тогда заносить в базу размер каждой картинки и считывать соответственно записи. Т.е как в переменную s в цикле заносилась картинка, так и считывать. Меня тоже интересует ответ на этот вопрос: как записать в базу Sqlite картинку и соответственно ее считать. Пока вопрос остается открытым.
Аватара пользователя
alexsa
новенький
 
Сообщения: 28
Зарегистрирован: 02.06.2011 23:10:20

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

Сообщение alexsa » 07.06.2011 00:12:49

Я решил эту проблему просто - все картинки лежат в папочке, а папочка в одном каталоге с исполняемым файлом. Там же и *.db. Сохраняю в базе данных в поле String адрес картинки вместо картинки. Потом загружаю из базы адрес картинки и Image1.Picture.LoadFromFile(SQLQuery1.FieldByName('photo').AsString);

И Все!!!
Аватара пользователя
alexsa
новенький
 
Сообщения: 28
Зарегистрирован: 02.06.2011 23:10:20

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

Сообщение minoshi » 07.06.2011 08:47:14

alexsa писал(а):Я решил эту проблему просто - все картинки лежат в папочке, а папочка в одном каталоге с исполняемым файлом. Там же и *.db. Сохраняю в базе данных в поле String адрес картинки вместо картинки. Потом загружаю из базы адрес картинки и Image1.Picture.LoadFromFile(SQLQuery1.FieldByName('photo').AsString);

И Все!!!


Поздравляю с переизобретением велосипеда :))

Как совет - записываете относительный путь, а не полный - т.е. "imagefolder/image.jpg", а не "/home/user/imagefolder/image.jpg".
Так вы сохраните возможность копировать программу с базой в другие каталоги или компьютеры.
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение alexsa » 07.06.2011 08:56:47

minoshi писал(а):Поздравляю с переизобретением велосипеда :))


:D Спасибо за поздравление. Но у меня и так имеется такая возможность ложить файл с программой в любое место, так как программа определяет свое местонахождение, где бы ни была. Но за совет спасибо. :D Как то не подумал, что можно и так.
Аватара пользователя
alexsa
новенький
 
Сообщения: 28
Зарегистрирован: 02.06.2011 23:10:20

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

Сообщение vada » 07.06.2011 10:05:53

Код в студию!
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

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

Сообщение alexsa » 07.06.2011 11:16:34

vada писал(а):Код в студию!


path:=GetCurrentDir;
flName:=path+'/img';

procedure TForm1.btnPhotoClick(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
flName:=flName+'/'+ExtractFileName(OpenPictureDialog1.FileName);
end;
Аватара пользователя
alexsa
новенький
 
Сообщения: 28
Зарегистрирован: 02.06.2011 23:10:20

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

Сообщение vada » 07.06.2011 14:00:31

Что-то я в коде не нашел ни про SQL ни про blod... Хотя image есть.
Проблема то в каком месте?
ЗЫ. Кстати, LoadFromFile рекомендуется в try блок упаковать.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

Рейтинг@Mail.ru