Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   FireBird, ZeosLib y JPEG en BLob (https://www.clubdelphi.com/foros/showthread.php?t=68135)

JCarlosas 26-05-2010 21:58:48

FireBird, ZeosLib y JPEG en BLob
 
Hola a todos.
Estoy tratando de almacenar imagenes en un campo de una BBDD en FireBird.
He probado lo tipico para otras BBDD de almacenar dicha imagen en un campo de tipo BLOB y no me funciona.
Estoy usando FireBird 2.5 y ZeosLib.
No encuentro la manera que me funcione.
Queria saber si alguien ha logrado almacenar imagenes en algun campo de una tabla de FireBird usando ZeosLib.
Si lo ha logrado le agradeceria ver el fragmento de codigo lo mas detallado posible con el cual lo logro.
Saludos coridales.
JCarlos

Casimiro Notevi 26-05-2010 22:43:48

Si haces una búsqueda en clubdelphi seguro que encuentras sobre ese tema porque se ha tratado en muchas ocasiones.
Independientemente que sea con zeoslib, ibx, fibplus, etc.
Aquí tienes un documento en formato pdf bastante completo que también te explica lo que necesitas sobre los campos blob.

Más o menos es algo así:
Código Delphi [-]
  Var TheStream : TMemoryStream;
Begin
  TheStream := TMemoryStream.Create;
  Try
    Image1.Picture.Bitmap.Savetostream(TheStream);
    With qryBlobInsert do 
    Begin
      Sql.Text := 'INSERT INTO EVENTS (EventNo,EVENT_PHOTO) VALUES (100,:ThePicture)';
      Params.Clear;
      Params.CreateParam(ftBlob,'ThePicture', ptInput);
      ParamByName('ThePicture').LoadfromStream(TheStream,ftBlob);
      ExecSQL;
    End;
  Finally
    TheStream.Free;
  End;
End;

Y en todo caso... explícanos qué es lo que no te funciona, cómo lo estás haciendo, etc.

JCarlosas 28-05-2010 17:40:26

Hola. Muchas gracias por su rápida respuesta. Yo había probado con un código parecido a ese y no me funciono. Volví a probar con ese y tampoco me funciono pero quizás es por mi ignorancia respecto a la configuración de los parámetros. :)
Sin embargo tengo colegas que me han asegurado que el código que me muestras les ha funcionado con Delphi y otros componentes distintos a ZEOS.
Yo estoy trabajando con Lazarus y con Zeos.
Por suerte encontré otra forma también de hacerlo las cual les pongo debajo.

Código Delphi [-]
//Formato de la tabla
(*
CREATE TABLE BIOLIFE (
  ID INTEGER NOT NULL,
  CATEGORY VARCHAR(15) CHARACTER SET WIN1251 COLLATE WIN1251,
  GRAPHIC BLOB);
*)
Procedure TForm1.ButtonCargarImagenEnBBDDClick(Sender: TObject);
var
    fs : TFileStream ;
    blob: Tstream;
begin
   if odpict.Execute
     then Begin
            //Este ejemplo utiliza un TZtable (ztbBioLife), pero debe funcionar igual para TZQuery
            //Se supone que ztbBioLife esta posicionado en el registro adecuado.
            //Se puede usar tambien un TZQuery con una setencia Select * from table where id=xxx
            //Y despues de parado en el registro adecuado hacer lo que se muestra en el codigo.
            //Si esta utlizando un DBGrid. No necesita hacer ninguna otra modificacion al codigo
            //En este caso se insertara la imagen en el registro que este seleccionado en el dbgrid
            DM.ztbBioLife.Edit;
            blob := DM.ztbBioLife.CreateBlobStream(DM.ztbBioLife.FieldByName('graphic'), bmWrite);
            try
              blob.Seek(0, soFromBeginning);
              fs := TFileStream.Create(odpict.FileName, fmOpenRead or fmShareDenyWrite);
              try
                blob.CopyFrom(fs, fs.Size);
              finally
                  fs.Free
                end;
              finally
                blob.Free
               End;
          end;

End;

//*****************************************************************************
Procedure TForm1.DBGrid2SelectEditor(Sender: TObject; Column: TColumn;
  Var Editor: TWinControl);
var
   blob: TStream;
Begin
  blob := DM.ztbBioLife.CreateBlobStream(DM.ztbBioLife.FieldByName('graphic'), bmRead);
  blob.Seek(0, soFromBeginning);
  try
   Image2.Picture.LoadFromStreamWithFileExt(blob, '.jpg');
   Image2.Update;

  finally
    blob.Free;
    Image2.Update;
  end;
end;

Lo anterior fue probado con FireBird. Quiero ver si con postgressql funciona también, pero no encontre el tipo de campo BLob en Posgresql. Tengo que averiguar aun cual es el equivalente.

El ejemplo anterior supone que fue insertado el registro con anterioridad y que después se le va a insertar la imagen en el campo adecuado.
Muchas gracias por todo.
JCarlos

keine1lust 08-04-2014 17:18:39

solución es que se debe incluir en la unidad db
 
Buenas la solución es que se debe incluir en la unidad db para que funciones con lazarus y con eso el ejemplo anterior que muestra la guia de zeos funciona perfecto y para mi parecer es bastante sencilla


La franja horaria es GMT +2. Ahora son las 01:04:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi