Конференция "Базы" » TADOQuery и BLOB-поле [D7, MSSQL]
 
  • BBCHa (04.07.08 19:01) [0]
    Знатоки, подскажите!
    Возможно ли запихать SQL - запросом содержимое TImage (bmp, jpg) в базу и вытянуть опять же SQL-запросом обратно???

    D7, база MsSQL.

    Заранее пасибо.
  • Johnmen © (04.07.08 19:13) [1]
    Конечно можно.
  • Loginov Dmitry © (04.07.08 19:26) [2]
    > Возможно ли запихать SQL - запросом содержимое TImage (bmp,
    > jpg) в базу и вытянуть опять же SQL-запросом обратно???


    Насчет SQL не знаю, может в MSSQL как-то и можно. В Delphi традиционно это делается с помощью методов SaveToStream() и LoadFromStream() класса TBlobField (здесь возможны и другие варианты).
  • BBCHa (04.07.08 19:42) [3]

    > Johnmen ©   (04.07.08 19:13) [1]
    > Конечно можно.


    А можно как то по подробнее???
  • Johnmen © (04.07.08 19:46) [4]
    Берём содержимое TImage, запихиваем его в параметр параметрического запроса, выполняем запрос.
    Выполняем запрос на вытягивание желаемого, наполняем содержимое TImage вытянутым.
  • BBCHa (06.07.08 01:27) [5]

    > Johnmen ©   (04.07.08 19:46) [4]
    > Берём содержимое TImage, запихиваем его в параметр параметрического
    > запроса, выполняем запрос.
    > Выполняем запрос на вытягивание желаемого, наполняем содержимое
    > TImage вытянутым.


    На счет второго абзаца разобрался,
    Form1.Image1.Picture.Assign(TBlobField(Query.FieldByName('Photo')));



    А вот с первым, по поводу "запихиваем" - не получается.

    Пробую так:
    Query.Parameters[2].DataType := ftGraphic;
    Query.Parameters[2].Assign (Form1.Image1.Picture.Bitmap);


    В этом случае в базу что то записывается, но при запросе содержимого прога его не понимает и выдает чистый Image.

    Если так:
    Query.Parameters[2].DataType := ftGraphic;
    Query.Parameters[2].LoadFromFile ('D:\photo.bmp', ftGraphic);


    или
    Table.Edit;
    TBlobField(Table.FieldByName('Photo')).LoadFromFile('D:\Photo.bmp');
    Table.Post;



    опять же ,все вроде выполняется, но при попытке загрузить картинку из базы, даже через DBImage возникает ошибка "Bitmap image is not valid"

    Знатоки, кто-нибудь, помогите разобраться???
  • Правильный^Вася (06.07.08 15:34) [6]

    > ftGraphic

    не надо так, используй ftBlob
  • BBCHa (06.07.08 16:35) [7]
    Использовал.

    После записи бмп в базу
    Query.Parameters[2].DataType := ftBlob;
    Query.Parameters[2].LoadFromFile ('D:\photo.bmp', ftBlob);



    При попытке визуализации картинки появилаась ошибка "Bitmap image is not valid"
  • Правильный^Вася (06.07.08 18:19) [8]

    > При попытке визуализации картинки появилаась ошибка "Bitmap
    > image is not valid"

    код попытки?
  • BBCHa (06.07.08 18:24) [9]
    Сохранение в БД
    Query := TADOQuery.Create(Self);
    Query.Connection := frDM.ADOConnection;
    i := MaxValueFieldTable(frDM.ADOConnection, 'Workers', 'ID_Worker') + 1;
    Query.SQL.Text := 'INSERT INTO Workers ' +
                             '(ID_Worker, Name_Worker, Adress, Phone, ID_Special, ID_Cvalific, Time_Work, Comment, ' +
                             'Status_Worker, Status_Record, ModifyComment, YB_Worker, DateCreate, Photo, ID_User) ' +
                             'VALUES ' +
                             '(' +
                             IntToStr(i) + ', ' +
                             '''' + frWorkersService.edName_Worker.Text + ''',' +
                             '''' + frWorkersService.edAdress_Worker.Text + ''',' +
                             '''' + frWorkersService.edPhone_Worker.Text + ''',' +
                             frWorkersService.edSpecial_Worker.Value + ',' +
                             frWorkersService.edCvalific_Worker.Value + ',' +
                             IntToStr(frWorkersService.edYB_Worker.Value) + ',' +
                             '''' + frWorkersService.edComment_Worker.Text + ''',' +
                             '0,1,'''',' +
                             ':YB, :Dat, :Ph,' +
                             frWorkersService.edUser_Worker.Value +
                             ')';
    Query.Parameters[0].DataType := ftDate;
    Query.Parameters[0].Value := frWorkersService.edHB_Worker.Date;
    Query.Parameters[1].DataType := ftDate;
    Query.Parameters[1].Value := Date;
    Query.Parameters[2].DataType := ftBlob;
    Query.Parameters[2].LoadFromFile (frWorkersService.edPhoto_Worker.Hint, ftBlob);
    Query.ExecSQL;



    Визуализация сохраненной картинки
    frWorkersService.edPhoto_Worker.Picture.Assign(TBlobField(Query.FieldByNam e('Photo')));



    В этом месте происходит ошибка "Bitmap image is not valid"
  • BBCHa (06.07.08 18:55) [10]
    В принципе проблема не в визуализации, а в сохранении, потому как даже если я подключаюсь к таблице TADOTable, и к нему цепляю DBImage - при переходе на введенную строку вылезает та - же ошибка... Т. е. видимо это проблема сохранения.
  • Zergost (23.07.08 08:46) [11]
    Кто нибудь смог сохранить??
  • zorik © (23.07.08 09:26) [12]
    В Firebird я так делал:
    (FieldByName('photo') as TBlobField).LoadFromFile(AFileName)
  • zorik © (23.07.08 09:31) [13]

    var
     m: TMemoryStream;
     jpg: TJpegImage;
    begin
      jpg:=TJpegImage.Create;
      m:=TMemoryStream.Create;
    try
      try
        jpg.LoadFromFile(OPD.FileName);
        jpg.SaveToStream(m);
        m.Position:=0;
        with Query do
        begin
           Edit;
           (FieldByName('photo') as TBlobField).LoadFromStream(m);
           Post;
        end;
     except
        on E:Exception do
          raise Exception.Create(...);
     end;
    finally
     jpg.Free;
     m.Free;
    end;


    -- со старого проєкта
  • zorik © (23.07.08 09:33) [14]
    Сори, недочитал, что надо запросом
  • Ega23 © (23.07.08 09:45) [15]

    > zorik ©   (23.07.08 09:31) [13]


    Зачем грузить из файла в стрим, а потом из стрима в BLOBField, если у TBLOBField есть метод LoadFromFile????
  • Ega23 © (23.07.08 09:49) [16]

    > Визуализация сохраненной картинки
    > frWorkersService.edPhoto_Worker.Picture.Assign(TBlobField(Query.
    > FieldByNam e('Photo')));


    var
     ms : TMemoryStream;
     bmp : TBitmap;
    begin
     with Query do
     begin
       if (not Active) or (IsEmty) then Exit;
       ms := TMemoryStream.Create;
       try
         TBLOBField(FieldByName('Photo')).SaveToStream(ms);
         ms.Position := 0;
         bmp := TBitmap.Create;
         try
           bmp.LoadFromStream(ms);
           edPhoto_Worker.Picture.Assign(bmp);
         finally
           bmp.Free;
         end;  
       finally
         ms.Free;
       end;
     end;
    end;

  • Anatoly Podgoretsky © (23.07.08 10:21) [17]
    Теперь в самый раз вспомнить, что кроме TImage есть и TDBImage
  • zorik © (23.07.08 10:48) [18]

    > Теперь в самый раз вспомнить, что кроме TImage есть и TDBImage

    Только в случае с bitmap. Стандартный TDBImage, насколько мне не изменяет память, отображает только bitmap
  • Ega23 © (23.07.08 10:51) [19]

    > Стандартный TDBImage, насколько мне не изменяет память,
    > отображает только bitmap


    Изменяет. Не только битмап.
  • zorik © (23.07.08 10:57) [20]

    > Ega23 ©   (23.07.08 10:51) [19]

    На практике, только что проверил, jpeg у меня не отображался. Использую TJvDBImage (JEDI) -- там все ок. Может где-то в свойствах TDBImage.Picture надо формат задавать и тогда все будет ок. Не знаю )))
  • Ega23 © (23.07.08 11:03) [21]

    > На практике, только что проверил, jpeg у меня не отображался.

    uses JPEG; ?
  • zorik © (23.07.08 11:06) [22]

    > uses JPEG; ?

    Да

    "Bitmap Image is not valid"
  • Anatoly Podgoretsky © (23.07.08 11:57) [23]

    > zorik ©   (23.07.08 09:31) [13]

    Так тут еще вопрос, как различать, что в поле, поле то не OLE
    А если судить по твоему советуж, то тебе как то все равно это

    > zorik ©   (23.07.08 10:48) [18]
  • stas © (23.07.08 12:09) [24]
    Ega23 ©   (23.07.08 11:03) [21]
    Причем здесь uses jpeg?
    нет возможности у стандартного DBImage отображать JPEG.
  • Ega23 © (23.07.08 12:12) [25]

    > нет возможности у стандартного DBImage отображать JPEG.


    Да? Я просто этой фигнёй не пользовался никогда... А для обычного - достаточно uses jpeg дописать...
  • zorik © (23.07.08 15:07) [26]
    Поиск по словах DBImage+JPEG дает много ссылок как с этим боротся -- грузить в Image или же использовать сторонние компоненты. Тут проблема в том, что надо предварительно определить что в блобе: битмап грузится в picture.bitmap, a jpeg в picture.graphic
  • stas © (23.07.08 15:24) [27]
    zorik ©   (23.07.08 15:07) [26]
    Пиши еще тип в другое поле.
  • zorik © (23.07.08 15:27) [28]

    > stas ©   (23.07.08 15:24) [27]

    Мне уже неактуально это.

    Насорили здесь, а автора вопроса уже давно нет
  • Ega23 © (23.07.08 15:30) [29]

    > Пиши еще тип в другое поле.


    Зачем???
    JPEG должен начинаться с $FFD8, bmp - $424D (в bmp, по-моему, в сигнатуре ещё 3-й байт участвует). Стрим у тебя уже есть. Читаешь 2 байта и смотрищь, чему они равны.
  • piople © (24.07.08 07:38) [30]
    1. Через таблицу:
    (table1.fieldbyname('ddd') as TBlobField).loadfromfile('dddss');



    Для некоторых баз данных через BDE так можно загрузить не более 64k

    2. через параметры в квере...
    ADOquery1.sql.text:='Insert into myTable (a) Values (:b)';
    ADOQuery1.parameters.parseSQL(ADOquery1.sql.text, true);
    ADOQuery1.parameters.parambyname('b').LoadFromFile('MyFile');
    ADOQuery1.execsql;

  • Ega23 © (24.07.08 10:00) [31]

    > Для некоторых баз данных через BDE так можно загрузить не
    > более 64k


    В настройках алиаса параметр BLOB Size для лохов придуман?
  • piople © (25.07.08 05:24) [32]
    Ega23 ©, хз, тебе виднее...
  • Нат (29.07.08 18:51) [33]
    Стандартный DBImage не умеет работать с jpeg
    Универсальное свойство - Picture
    Используйте в Image.Picture.LoadFromFile(), Image.Picture.Assign(),
    Также LoadFromStream(), CreateBlobStream, SaveToFile

    Запрос на сохранение
    insert into MyTable ( MyPictureField) values ( :ParamPict);

    на удаление
    Update MyTable set MyPictureField = null where ID= КлючНужнойЗаписи;
  • Нат (30.07.08 00:25) [34]
 
Конференция "Базы" » TADOQuery и BLOB-поле [D7, MSSQL]
Есть новые Нет новых   [134473   +28][b:0][p:0.004]