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)
-   -   Imagenes en Campos Blob (https://www.clubdelphi.com/foros/showthread.php?t=15872)

subzero 08-11-2004 15:23:27

Imagenes en Campos Blob
 
Hola amigos y amigas del foro:

Estoy seguro que este tema lo han tratado con anterioridad, mi inquietud consta en la necesidad de guardar una imagen dentro de un campo blob haciendolo por medio de instrucciones sql escritas en delphi, he revisado los ejemplos aqui propuestos pero aun no he encontrado la manera de hacerlo.

A todos gracias, de antemando si pueden ayudarme ;)

Neftali [Germán.Estévez] 08-11-2004 15:53:40

...utiliza parámetros
 
Sin ir más lejos (debes utilizar parámetros):
http://www.clubdelphi.com/foros/showthread.php?t=11107


NOTA: La forma de definir parámetros cambia dependiendo de la Base de Datos y de los componentes de acceso, pero la idea es siempre la misma; Éste sistema lo he utilizado con Access, IB, SQlServer y Oracle y siempre me ha ido bien.

subzero 08-11-2004 20:38:00

Gracias por la ayuda en efecto me funcionó, ahora mi actual dilema es cargar esa imagen que se encuentra almacena y mostrarla en un TImage, les agradesco cualquier sugerencia. :(

Neftali [Germán.Estévez] 09-11-2004 09:57:06

Cita:

Empezado por subzero
...ahora mi actual dilema es cargar esa imagen que se encuentra almacena y mostrarla en un TImage

¿Porqué no utilizas un DBImage?

subzero 16-11-2004 21:27:25

No, ya que estoy trabajando con consultas, pero no hay ningun problema ya puedo mostrar la imagen, utilizando algunos de los ejemplos que me ha proporcionado el foro, hice algo así:

var
temporal_imagen : TStream; jp : TJpegImage;
...
imgFoto.Picture := nil;
temporal_imagen := IBQuery.CreateBlobStream(fieldbyname('PLA_MPIO_FOTO'), bmRead);
jp := TJpegImage.Create;
jp.LoadFromStream(temporal_imagen);
imgFoto.Picture.Assign(jp);
FreeAndNil(jp);
temporal_imagen.Free;
...

ha, gracias por la sugerencia

subzero 16-11-2004 22:22:13

Tengo un nuevo problema... cuando cargo la imagen que se encuentra almacenada se me presentan errores como #53, #43, no se si el error este ligado al momento de guardarla o de cargarla para una mejor descripción expongo el método que empleo

Almacenamiento
with ModuloDatos.IBQuery do
begin
close;
sql.clear;
sql.Add('UPDATE IMAGE');
sql.Add('SET FOTO = :fto');
sql.Add('WHERE CODIGO = :vlr');
ParamByName('vlr').AsString := '' + codigo + '';
ParamByName('fto').LoadFromFile(OPDFoto.FileName, ftBlob);
ExecSQL;
end;

Gracias por intersarse en mi duda ;)

subzero 26-11-2004 16:15:25

Borrar Blob's
 
Hola foro:

Tras de un largo tiempo de investigación creo descubir una de las características por las cuales se presentan los errores al momento de manipular imagenes que son guardadas en campos blob antes de asignarle la información del campo es necesario crear :
...
Image1.Picture := nil;
Image1.Picture.Graphic:= TJpegImage.Create;
temporal_imagen := DMDatos.IBQuery.CreateBlobStream(fieldbyname('PLA_MPIO_FOTO'), bmRead);
imgFoto.Picture.Graphic.LoadFromStream(temporal_imagen);
temporal_imagen.Free;

...

:confused: Mi actual duda es "Como eliminar la información que se encuentra almacenada en un campo blob sin borrar el registro" :confused:

He intentado por medio de la sentencia sql

UPDATE PLANTA_MUNICIPAL
SET PLA_MPIO_FOTO = NULL
WHERE PLA_MPIO_CODIGO = :vlr


Pero igual queda algo. Les agradesco cualquier idea, gracias ;)

athlontado 26-11-2004 16:44:13

No, no queda nada. Simplemente deja el espacio anteriormente ocupado por el blob, disponible para nuevos datos.

Normalmente, el tamaño de la BBDD nunca baja, a no ser que hagas un backup/restore. Eso es porque Firebird aumenta el tamaño de la BBDD por páginas, cuando todas las páginas disponibles están llenas de datos, se aumenta el tamaño del fichero de la BBDD para alojar las nuevas páginas. Pero si borramos datos, las páginas donde esos datos estaban no se borran, sino que se dejan disponibles para los que vengan más tarde.

subzero 26-11-2004 16:49:40

No estoy trabajando en Interbase 6.0 y en el campo hexadecial queda "basura", en text "œZM" y en el richText "œZM", por si acaso estoy utlizando el EMS Interbase Manager

Por si acaso estoy trabajando en delphi 7, y desde allí envio la sentencia SQL :)

athlontado 26-11-2004 17:10:04

Por si no lo sabes, FB es hijo de IB6, por lo que su funcionamiento, en este aspecto es idéntico.

Efectivamente, el Blob sique apuntando al bloque donde se almacenaban los datos antiguos y, por eso, recupera basura al mostrarlo en un memo.
Esos datos no se eliminarán hasta la próxima recolección de basura de la BBDD ó hasta que no se haga un Backup/Restore ó, hasta que el espacio al que apunta el blob lo reserve otro blob.

subzero 26-11-2004 17:17:16

Si te has dado cuenta estoy tratando de cargarlo en un Image, pero como viene con basura me genera errores, que puedo hacer dentro del condicional inserto una nueva validación que verifique que no sea igual a "œZM", (no queria hacerlo así...). Debe existir algún metodo puesto que desde la consola lo puedo colocar nulo pero desde Delhpi no :(

athlontado 26-11-2004 17:27:59

Intenta cargar el Stream dentro de un bloque try..except y, en el except implementas el código necesario para mostrar una imagen en blanco. Creo que con eso te bastaría.


La franja horaria es GMT +2. Ahora son las 19:47:56.

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