Конференция "Базы" » 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


    Изменяет. Не только битмап.
 
Конференция "Базы" » TADOQuery и BLOB-поле [D7, MSSQL]
Есть новые Нет новых   [134473   +28][b:0][p:0.003]