Ir al contenido


Foto

Grabar Imagen desde delphi con un store procedure de firebird y dbexpress


  • Por favor identifícate para responder
6 respuestas en este tema

#1 rigoberto

rigoberto

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 20 septiembre 2012 - 02:59

Saludos amigos, este tema puede parecer conocido pero por lo que busque parece que no.
tengo varias preguntas y les pido paciencia.
soy totalmente nuevo en esto de la programacion y estoy dando unos pininos.
resulta que estoy utilizando deexpress para conectarme a firebird (2.5) con delphi xe2, tengo un sp donde grabo los datos que le paso de delphi al sp, todo va bien hasta que decide colocar una imagen a mi form para guardarlo en la base de datos.
Tengo una tabla para guardar las imagenes, tengo un campo creado como blob subtype 0 segment size 100.
en mi sp le puse un parametro de entrada que se llama fcliente blob suptype 0 segment sixe 100.
al ejecutar el sp me da un error de addres violation. si le quite ese parametro de entrada el sp se ejecuta bien.
me estoy volviendo loco. que podra ser?
Tambien al tratar de guardar la foto desde delphi con el sp como le paso ese valor al parametro.
mi sp se llama grabarcliente y le paso los valores de la siguiente forma



delphi
  1. spgrabarcliente.params[1].value:=edit1.text




delphi
  1. spgrabarcli.params.ParamByName('FCLIENTE').LoadFromFile(abrirfoto.FileName,ftblob);



donde fcliente es el nombre del parametro de entrada en el sp
abrirfoto es el nombre del componente para abrir imagenes de delphi  y lo utiliso con un Timage.

por ultimo me han dicho que utilizar Dbedits me consume mucha memoria que mejor utilice los Tedit, aunque sea mas trabajoso que hay de cierto en eso.

muchas gracias  8o|


muchas gracias
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 21 septiembre 2012 - 08:54

Te adjunto aplicación de ejemplo, funcionando perfectamente.  Solo ajusta la ruta de la DB y asegúrate de que la extensión del archivo de imagen sea .jpeg.

Y coloca un numero diferente en el Edit1  para que la clave principal sea única.

Saludos.



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   S: TMemoryStream;
  4. begin
  5.   if OpenDialog.Execute then
  6.   begin
  7.     Image.Picture.LoadFromFile(OpenDialog.FileName);
  8.     S := TMemoryStream.Create;
  9.     try
  10.       Image.Picture.Graphic.SaveToStream(S);
  11.       sp.Params[1].LoadFromStream(S, ftBlob);
  12.       sp.Params[0].AsInteger := strToInt(Edit1.Text);
  13.       sp.ExecProc;
  14.     finally
  15.       S.Free;
  16.     end;
  17.   end;
  18. end;




/******************************************************************************/
/***      Generated by IBExpert 2011.12.11 21/09/2012 10:18:20 a.m.        ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE 'H:\blobTest\BlobDB.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET ISO8859_1 COLLATION ISO8859_1;



/******************************************************************************/
/***                              Generators                              ***/
/******************************************************************************/

CREATE GENERATOR GEN_TABLA_ID;
SET GENERATOR GEN_TABLA_ID TO 0;



SET TERM ^ ;



/******************************************************************************/
/***                          Stored Procedures                            ***/
/******************************************************************************/

CREATE PROCEDURE TABLA_INS (
    ID INTEGER,
    IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 100)
AS
BEGIN
  EXIT;
END^






SET TERM ; ^



/******************************************************************************/
/***                                Tables                                ***/
/******************************************************************************/



CREATE TABLE TABLA (
    ID      INTEGER NOT NULL,
    IMAGEN  BLOB SUB_TYPE 0 SEGMENT SIZE 100
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE TABLA ADD CONSTRAINT PK_TABLA PRIMARY KEY (ID);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                          ***/
/******************************************************************************/



/* Trigger: TABLA_BI */
CREATE TRIGGER TABLA_BI FOR TABLA
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_TABLA_ID,1);
END
^


SET TERM ; ^



/******************************************************************************/
/***                          Stored Procedures                            ***/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE TABLA_INS (
    ID INTEGER,
    IMAGEN BLOB SUB_TYPE 0 SEGMENT SIZE 100)
AS
BEGIN
  INSERT INTO TABLA (
    ID,
    IMAGEN)
  VALUES (
    :ID,
    :IMAGEN);
END^



SET TERM ; ^

  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 21 septiembre 2012 - 12:41

asegúrate de que la extensión del archivo de imagen sea .jpeg.

Debería y casi podría asegurar de que funcionará con cualquier otro formato que esté soportado por el TImage. Cuando uno abre una imagen (en tiempo de diseño) con el TImage se crea y asocia el TGraphic (concreto y adecuado al formato en cuestión) con éste.
Es el TGraphic el responsable de generar la visualización de la imagen, ya que dispone de los mecanismos necesarios para entender al formato.

Cuando uno invoca al método SaveToStream() generará un Stream con el contenido en binario. Como información binaria, almacenará la estructura del formato en cuestión y la información. Por ejemplo, si en TImage se ha visualizado un .jpg, el TGraphic correspondiente será un TJPEGImage por lo que un SaveToStream() guardará en el stream la información de dicho .jpg. Si fuera una imagen .bmp en el stream se tendrá la información binaria de dicho .bmp, y así con los .ico y el resto de los formatos soportados.
Al momento de recuperar la información leída del campo blob es fundamental saber que es lo que se está leyendo. Por tanto es necesario que se disponga de un campo que se destine para guardar el tipo.
En caso de que se pueda garantizar de que todas las imagénes a guardar sean de un mismo tipo, el campo estaría sobrando y para leer la imagen ya en Delphi bastará con crear el TJPEGImage y proceder a recuperar el stream... en otro caso se debe de crear cada TGraphic en base al campo.

Saludos,
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 21 septiembre 2012 - 01:28


asegúrate de que la extensión del archivo de imagen sea .jpeg.

Debería y casi podría asegurar de que funcionará con cualquier otro formato que esté soportado por el TImage. Cuando uno abre una imagen (en tiempo de diseño) con el TImage se crea y asocia el TGraphic (concreto y adecuado al formato en cuestión) con éste.
Es el TGraphic el responsable de generar la visualización de la imagen, ya que dispone de los mecanismos necesarios para entender al formato.

Cuando uno invoca al método SaveToStream() generará un Stream con el contenido en binario. Como información binaria, almacenará la estructura del formato en cuestión y la información. Por ejemplo, si en TImage se ha visualizado un .jpg, el TGraphic correspondiente será un TJPEGImage por lo que un SaveToStream() guardará en el stream la información de dicho .jpg. Si fuera una imagen .bmp en el stream se tendrá la información binaria de dicho .bmp, y así con los .ico y el resto de los formatos soportados.
Al momento de recuperar la información leída del campo blob es fundamental saber que es lo que se está leyendo. Por tanto es necesario que se disponga de un campo que se destine para guardar el tipo.
En caso de que se pueda garantizar de que todas las imagénes a guardar sean de un mismo tipo, el campo estaría sobrando y para leer la imagen ya en Delphi bastará con crear el TJPEGImage y proceder a recuperar el stream... en otro caso se debe de crear cada TGraphic en base al campo.

Saludos,


Claro que sí, amigo Delphius, todo eso lo tengo más que claro, de todas formas siempre tus buenas explicaciones serán bienvenidas.  Lo que sucede es que mientras preparaba el ejemplo, en RunTime (no se porqué),  me reconocía solamente el .JPEG, cosa que me desconcertó un poco, entonces lo que hice fue curarme en salud para que no le saltara el error al amigo Rigoberto, y así pudiera comprender  la idea principal, que  era ilustrar la forma de cargar desde el TImage  hasta el parámetro ( Blob ) del Procedimiento almacenado.

De hecho, no recuerdo si fue el maestro Escafandra o Seoane, quien  posteó una muy buena forma de guardar imágenes en bases de datos sin importar el formato, que  se podría adaptar fácilmente a la actual necesidad.

Un cordial saludo.
  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 21 septiembre 2012 - 04:22

.....

por ultimo me han dicho que utilizar Dbedits me consume mucha memoria que mejor utilice los Tedit, aunque sea mas trabajoso que hay de cierto en eso.

muchas gracias  8o|


muchas gracias


Saludos amigo rigoberto y bienvenido seas a la comunidad (y)...

Sobre la cuestión de los TDBEdits debo decir que el manejo óptimo de la memoria donde reside la base de datos depende mucho más del manejo de la conexión  que hagas, las consultas, los índices, etc. no tanto de usar uno u otro componente, de hecho los TDBedits así como todo el resto de componentes de acceso a la BD, están diseñados específicamente para ello...

Esa es mi opinión, a menos que alguien tenga otra idea diferente  :D

:angel:

Saludox ! :)
  • 0

#6 rigoberto

rigoberto

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 22 septiembre 2012 - 08:57

Muchas gracias por su respuestas, disculpen la tardanza en responder pero tuve problemas con el internet.sabia que podia contar con ustedes , pruebo y les dejo saber.
Gracias
  • 0

#7 rigoberto

rigoberto

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 25 septiembre 2012 - 04:24

muchachos muchas gracias funciono perfecto
lo marcare como resuelto
gracias
  • 0




IP.Board spam blocked by CleanTalk.