PDA

Ver la Versión Completa : Guardar un JPEG en un campo LongBlob


darkamerico
01-04-2016, 15:30:31
Saludos amigos, estoy realizando una aplicación donde uso un TUniQuery para mostrar los detalles de una persona, hay un campo llamado foto (LongBlob) que debe mostrar la foto de la persona y hay un boton debajo de la imagen que debe insertar una imagen en ese registro. El proceso
lo muestro en las siguientes imagenes:

1. Busqueda de la Persona:
http://s9.postimg.org/b7o9l8p4v/image.png

2. Detalle de la Persona en la Ficha:
http://s14.postimg.org/n7mil7ekx/image.png

Mi problema radica en el botón Cargar Imagen, pues tiene la mision de insertar una imagen (JPEG) hacia la BD.

La estructura de la tabla:

http://s24.postimg.org/m7ot4hvg5/image.png

Cuando hago click en la grilla del Paso 1, recupero el ID de la persona y lo coloco en una variable dentro del Formulario en el evento OnCellClick() de la grilla:

idPersSelecc:=gridResBusca.DataSource.DataSet.Fields[0].AsInteger;

Agradezco su ayuda amigos

Casimiro Notevi
01-04-2016, 16:28:05
Mira algunos de los mensajes del final de página, abajo del todo.
También puedes hacer una búsqueda, es un tema que se ha tratado infinidad de veces.
Avisa si no encuentras la solución.

darkamerico
01-04-2016, 16:32:02
Mira algunos de los mensajes del final de página, abajo del todo.
También puedes hacer una búsqueda, es un tema que se ha tratado infinidad de veces.
Avisa si no encuentras la solución.

Efectivamente, se ha tratado muchas veces pero usando componentes TTable, lo que tengo en este programa es un TQuery, lo que estoy requiriendo es un codigo que me recoja un archivo JPEG del disco duro y lo inserte directamente en el registro con el idPersSelecc de la variable.

Casimiro Notevi
01-04-2016, 16:36:07
Bien, por eso te he comentado esto:
Mira algunos de los mensajes del final de página, abajo del todo.
También puedes hacer una búsqueda, es un tema que se ha tratado infinidad de veces.
Avisa si no encuentras la solución.

AgustinOrtu
01-04-2016, 16:38:51
No importa el componente, a fin de cuentas siempre operas con TField; en este caso la clase especializada TBlobField

Ejemplo (http://www.clubdelphi.com/foros/showthread.php?t=89389&highlight=tblobfield)

En este enlace (http://www.clubdelphi.com/foros/showthread.php?t=88325&highlight=tblobfield) hay un ejemplo de ecfisa y tambien he subido una unidad con un metodo que le pasas un campo blob y lo vuelca en un TImage

Saludos

fredo
02-04-2016, 17:23:20
EL CAMPO DBiMAGE SOLO SOPERTA bmp, ¿por que? aun no tengo idea.... deviera soportar minimo png y jpg, pero bueno ya que no es el caso yo hici este codigo para usar jpg.

para evento afterscroll de ti query


var
JpegImage: TJPEGImage;
BlobStream: TStream;
begin
// FDQImagenes contiene las imagenes en memoria y ya esta activa con solo los productos que tiene imagen en JPG//
// FDQProductosVentas contiene la ficha del producto completa

FDQImagenesProductos.Close;
FDQImagenesProductos.ParamByName('codigo').asInteger :=FDQProductosVentascodigo.AsInteger;
FDQImagenesProductos.Open;

if FDQImagenesProductoscodigo.AsString <> '' then
Begin
if not FDQImagenesProductosimagen.IsNull then
Begin
try
BlobStream := FDQImagenes.CreateBlobStream(FDQImagenesProductos.FieldByName('imagen'), bmRead);
JpegImage := TJPEGImage.Create;
JpegImage.LoadFromStream(BlobStream);

ImagenProd1.Picture.Assign(JpegImage);
finally
JpegImage.Free;
BlobStream.Free;

SinImagenProd1.Visible := false;
ImagenProd1.Visible := true;
end;
End;
End
else
Begin
SinImagenProd1.Visible := true; // esto es un image que se superpone si no tiene imagen mostratno //que es un a incognita una imagen por defecto
ImagenProd1.Visible := false;
End;
end;


http://stna.cl/descargas/pantalla.png

creo es mas menos lo que quieres, salu2

fredo
02-04-2016, 17:27:40
para grabar la imagen seria muy similar.

var JpegImage: TJPEGImage;
begin
if FDQInsumoscodigo.AsString <> ''
then
Begin
if abrir.Execute
then
Begin
JpegImage:=TJPEGImage.Create;
try
JpegImage.LoadFromFile(abrir.FileName);
Imagen.Picture.Assign(JpegImage);
finally
JpegImage.Free;
end;

FDQImagenes.Close;
FDQImagenes.ParamByName('codigo').AsInteger:=FDQInsumoscodigo.AsInteger;
FDQImagenes.Open;

if FDQImagenescodigo.AsString = ''
then
Begin
FDQImagenes.Append;
FDQImagenescodigo.Value:=FDQInsumoscodigo.AsInteger;
End
else FDQImagenes.Edit;
FDQImagenesimagen.LoadFromFile(abrir.FileName);
FDQImagenesExt.Value:=Saca_extencion(abrir.FileName);
FDQImagenes.Post;
SinImagen.Visible:=false;
imagen.Visible:=true;
End;
End;
end;