Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Campos Blob con imagenes y stringgrid (https://www.clubdelphi.com/foros/showthread.php?t=91241)

rruffino 09-12-2016 15:10:21

Campos Blob con imagenes y stringgrid
 
Hola, buenas tardes... Tengo una situación... Tengo un sistema externo que trabaja con MySql y en una tabla se guarda la imagen capturada en un campo blob. Lo que necesito hacer es procesar esa tabla poniendo los datos en un stringgrid para despues volcar esos datos del stringgrid a la base de datos central que es en firebird donde tambien tengo un campo blob. He probado copiar en el stringgrid el contenido del campo blob como string y pasarlo a la base de datos como blob, pero luego al querer mostrar la imagen da error.
Agradezco si me dan una mano.
Saludos!!

roman 09-12-2016 15:27:15

Cita:

Empezado por rruffino (Mensaje 511638)
He probado copiar en el stringgrid el contenido del campo blob como string y pasarlo a la base de datos como blob, pero luego al querer mostrar la imagen da error.

Pero, ¿cómo podemos ayudarte si no pones ni el código que usas ni el mensaje de error que te da?

Lo único que puedo decirte es que para pasar el contenido de un dato de la base en MySQL a Firebird no necesitas un StringGrid de intermediario. Los campos BLOB se leen y escriben con streams. Por ejemplo, puedes usar un TMemoryStream para leer el contenido del campo de MySQL usando el método SaveSTotream del campo BLOB y luego LoadFromStream del otro campo para leer el contenido del stream al campo de FireBird. Algo así:

Código Delphi [-]
MySQLBlob.SaveToStream(Stream);
Stream.Seek(0, soFromBeginning);
FirebirdBlob.LoadFromStream(Stream);

LineComment Saludos

rruffino 09-12-2016 15:50:57

Respuesta
 
Hola Roman, gracias por la respuesta... Necesito el stringgrid intermedio porque es ahi donde el usuario del sistema decide que información se pasa a la base de datos central, por eso mi necesidad de almacenar el campo blob en el mismo stringgrid al momento de la lectura de la tabla mysql. Voy a probar lo de los metodos que me comentas y aviso.
Gracias!

rruffino 09-12-2016 18:06:36

Prueba
 
Mira, entre otras cosas he probado esto, dond Zquery_lectura es mi origen de donde tengo la imagen y quiero pasarla a mi tabla. Copia algo pero no lo puedo ver como imagen.

Código Delphi [-]
    bs:=TMemoryStream.Create;
    blobF:=TBlobField(DM.ZQuery_lectura.FieldByName('FOTO'));
    blobF.SaveToStream(bs);
    bs.Position:=0;

    with(DM.ManejaDatos)do
      begin
         SQL.Clear;
         SQL.Add('update rel_concepto_suministro set imagen=:ima where id_relacion=1');
         ParamByName('ima').AsBlob:=blobF.AsVariant;
         Open;
      end;

Gracias!!

ecfisa 09-12-2016 23:42:02

Hola.

La verdad es que no sé si comprendí realmente que es lo que buscas...
Creo haber entendido que tenes un query origen (donde está la imágen) y otro de destino donde se copiará ("mi tabla").

Entonces, si no inferí mal:
Código Delphi [-]
...
var
  Stream : TStream;
begin
  Stream := TMemoryStream.Create;
  try
    TBlobField( qryOrigen.FieldByName( 'IMAGEN' ) ).SaveToStream( Stream );
    Stream.Seek( soFromBeginning, 0 );
    qryDestino.Close;
    qryDestino.SQL.Text := 'UPDATE REL_CONCEPTO_SUMINISTRO SET IMAGEN = :IMAGE WHERE ID = :ID';
    qryDestino.ParamByName( 'ID' ).AsInteger := numero_id ; // ID de la tabla destino
    qryDestino.ParamByName( 'IMAGEN' ).LoadFromStream( Stream, ftBlob  );
    qryDestino.ExecSQL;
  finally
    Stream.Free;
  end;
...

Saludos :)

rruffino 10-12-2016 13:24:03

Respuesta
 
Hola!, gracias por la respuesta.... En realidad estoy intentando lo que has entendido, pero al no resultar hacerlo, lo que estoy intentando hacer para ver donde tengo el problema es tratar de leer de la base de datos origen (SQLlite) y pasar la imagen a un compronente TImage, con el siguiente código:

Código Delphi [-]
                    Stream:=TMemoryStream.Create;
                    TBlobField(DM.ZQuery_lectura.FieldByName('foto')).SaveToStream(Stream );
                    Stream.Seek(soFromBeginning, 0);
                    jpg:=TJPEGImage.Create;
                    Image10.Picture.Bitmap.LoadFromStream(Stream);
                    Stream.Free;

Utilizo Delphi 7, y los componentes Zeos. Al momento de la ejecución tira el error "Stream read error", como si el stream no tuviera dato alguno.
Mas alla del error, la imagen la puedo ver cargada en campo foto desde el gestor, es una imagen PNG.
Aguardo su ayuda compañeros, esto me esta secando la cabeza.
Gracias!!

rruffino 10-12-2016 14:07:08

Problema encontrado
 
Estuve leyendo como loco, y me entró la duda acerca del funcionamiento de los componentes Zeos, y para probar he bajado el de LiteDac, Eureka!! ese mismo código que he pegado en el mensaje anterior me funciona perfecto. Alguien sabe si eso del Zeos se puede solucionar, aparentemente no genera el steam de datos...
Saludos!

rruffino 10-12-2016 18:48:46

Problema Resuelto
 
Luego de mil pruebas, baje la version 7 de los componentes Zeos, instale esos y el código que anda dando vuelta por todos los foros funciona correctamente.
Gracias por la ayuda a todos los interesados.
Saludos!!!

rruffino 13-12-2016 20:00:48

Otro Problema
 
Buenas tardes.... siguiendo con el hilo, he podido al final poder obtener la imagen del campo BLOB y guardarla en disco usando:
Código Delphi [-]
                    MS:=TStringStream.Create('');
                    TBlobField(DM.ZQuery_lectura.FieldByName('foto')).SaveToStream(MS);
                    MS.Position:=0;
                    ImagenTablet.Picture.Graphic:= nil;
                    ImagenTablet.Picture.Graphic:= TPNGGraphic.Create; 
                    ImagenTablet.Picture.Graphic.LoadFromStream(MS);
                    ImagenTablet.Picture.Graphic.SaveToFile('C:\Imagen.png');

hasta aca todo bien... grabo la imagen y vía explorador de windows la puedo ver con doble click, editarla con el paint por ejemplo....
Pero lo que quiero ahora es cargar esa imagen en un TImage de la sieguiente manera:
Código Delphi [-]
      foto:='C:\Imagen.png';
      Stream := TMemoryStream.Create;
      try
        IF FileExists(FOTO)THEN
          Stream.LoadFromFile(foto);
        Stream.Position := 0;
        ImagenTablet.Picture.Graphic:= nil;
        ImagenTablet.Picture.Graphic:= TPNGGraphic.Create;
        ImagenTablet.Picture.Graphic.LoadFromStream(Stream);
      finally
        Stream.Free;
      end

Cuando lo ejecuto, tengo el hermoso error:
CANNOT LOAD IMAGE, INVALID OR UNEXPECTED PNG IMAGE FORMAT

Al momento de exportar tambien he probado de exportarlo con formato JPG y en ese caso obtengo el error
JPG ERROR #54

Agradezco cualquier sugerencia.
Mil gracias!!!


La franja horaria es GMT +2. Ahora son las 13:34:07.

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