Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2009-09

tquery insertar imagen en mysql

14 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Rafael Bidegain

Hola a todos

Necesito insertar una imagen en una tabla mysql 5, estoy trabajando con linux y lazarus 0.9.24

lo primero que hago es cargar la imagen en un timage con:

  if OpenPictureDialog1.execute then
  begin
     Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
     SQLQuery1.Active := false;
     SQLQuery1.Params.clear;
     SQLQuery1.SQL.clear;
     SQLQuery1.ParseSQL := true;
     //armo el insert
     SQLQuery1.SQL.Add('insert into imagenes ');
     SQLQuery1.SQL.Add('(imagen) values (:IMAGEN)');
     //esta es la linea que tengo que resolver...
     SQLQuery1.Params.ParamByName('IMAGEN').As ????
     SQLTransaction1.StartTransaction;
     SQLQuery1.ExecSQL;
     SQLTransaction1.Commit;
  end;

la pregunta es: �como seteo el parametro IMAGEN?

uso AsBlob, AsString ?

con qu� propiedad del widget image?

gracias

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Horacio Jamilis
to Rafael Bidegain

Debieras usar algo asi como

sqlquery1.Params[0].LoadFromFile([Nombre de Archivo]);

No lo cargues primero a un TImage.

Si por el contrario lo tienes en un timage, creas un tmemorystream, grab� la imagen del timage con...

procedure ....
var
  ms : TMemoryStream;
begin
  ms := TMemoryStream.Create;
  Image1.Picture.Bitmap.SaveToStream(ms);
  ms.Position := 0;
  sqlquery1.Params[0].LoadFromStream(ms);
  [...]

Espero que te sirva

Horacio

Show quoted text 21 lines
//armo el insert SQLQuery1.SQL.Add('insert into imagenes '); SQLQuery1.SQL.Add('(imagen) values (:IMAGEN)'); //esta es la linea que tengo que resolver... SQLQuery1.Params.ParamByName('IMAGEN').As ???? SQLTransaction1.StartTransaction; SQLQuery1.ExecSQL; SQLTransaction1.Commit; end; la pregunta es: �como seteo el parametro IMAGEN? uso AsBlob, AsString ? con qu� propiedad del widget image? gracias

Reply by email

Rafael Bidegain
to Horacio Jamilis

El d�a 29 de septiembre de 2009 15:43, Horacio Jamilis <hjamilis en pymesoft.com.ar> escribi�:

Show quoted text 21 lines
Debieras usar algo asi como sqlquery1.Params[0].LoadFromFile([Nombre de Archivo]); No lo cargues primero a un TImage. Si por el contrario lo tienes en un timage, creas un tmemorystream, grab� la imagen del timage con... procedure .... var �ms : TMemoryStream; begin �ms := TMemoryStream.Create; �Image1.Picture.Bitmap.SaveToStream(ms); �ms.Position := 0; �sqlquery1.Params[0].LoadFromStream(ms); �[...] Espero que te sirva

gracias Horacio, me sirvio bastante.

un detalle que tuve que agregar a tu solucion es especificar un parametro adicional que me solicita LoadFromStream, qued� as� sqlquery1.Params[0].LoadFromStream(ms, ftBlob);
con eso puede hacer el insert pero no puedo visualizar la imagen en un dbImage asociado al dbgrid.

de paso te hago otra consulta respecto a tu solucion. es necesario liberar la memoria del Stream luego de usarla? yo la estoy liberando con Stream.free, pero me gustar�a estar seguro.

en la primera linea de tu solucion me sugieres que no cargue la imagen en un timage.
como me sugieres que lo haga?

saludos

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Horacio Jamilis
to Rafael Bidegain

Rafael Bidegain escribi�:

Show quoted text 16 lines
<hjamilis en pymesoft.com.ar> escribi�: > procedure .... > var > ms : TMemoryStream; > begin > ms := TMemoryStream.Create; > Image1.Picture.Bitmap.SaveToStream(ms); > ms.Position := 0; > sqlquery1.Params[0].LoadFromStream(ms); > [...] > > Espero que te sirva > sqlquery1.Params[0].LoadFromStream(ms, ftBlob);

Es correcto.

Show quoted text 5 lines
de paso te hago otra consulta respecto a tu solucion. es necesario liberar la memoria del Stream luego de usarla? yo la estoy liberando con Stream.free, pero me gustar�a estar seguro.

Si, es necesario liberar el memorystream. Salvo que quieras agotar la memoria de la m�quina a prop�sito :-)

en la primera linea de tu solucion me sugieres que no cargue la imagen en un timage. como me sugieres que lo haga?

Si la imagen est� en un archivo, la cargas directamente en le par�metro con LoadFromFile(Nombre del archivo de la imagen). Debiera funcionar.

saludos

Horacio

Reply by email

JoshyFun
to Rafael Bidegain: El d�a 29 de septiembre de 2009 15:43, Horacio Jamilis <hjamilis en pymesoft.com.ar>…

Hello Rafael,

Tuesday, September 29, 2009, 10:00:59 PM, you wrote:

RB> de paso te hago otra consulta respecto a tu solucion. RB> es necesario liberar la memoria del Stream luego de usarla? RB> yo la estoy liberando con Stream.free, pero me gustar�a estar seguro.

Para saber estas cosas, lo m�s sencillo es NO liberarlo y compilar el proyecto con la opci�n "Heaptrc" que est� en "Proyecto -> Opciones del compilador -> Enlazador". Si al salir del programa te da una serie de errores de memoria no liberada, ya te dice en qu� linea se captur� esa memoria que luego no ha sido liberada.

En este caso es si, la respuesta es si :) Pero el Heaptrc ayuda y mucho a crear programas sin "p�rdidas" de memoria ;)

Best regards, JoshyFun

Reply by email

Rafael Bidegain
to JoshyFun

El d�a 29 de septiembre de 2009 19:06, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 16 lines
Hello Rafael, Tuesday, September 29, 2009, 10:00:59 PM, you wrote: RB> de paso te hago otra consulta respecto a tu solucion. RB> es necesario liberar la memoria del Stream luego de usarla? RB> yo la estoy liberando con Stream.free, pero me gustar�a estar seguro. Para saber estas cosas, lo m�s sencillo es NO liberarlo y compilar el proyecto con la opci�n "Heaptrc" que est� en "Proyecto -> Opciones del compilador -> Enlazador". Si al salir del programa te da una serie de errores de memoria no liberada, ya te dice en qu� linea se captur� esa memoria que luego no ha sido liberada. En este caso es si, la respuesta es si :) Pero el Heaptrc ayuda y mucho a crear programas sin "p�rdidas" de memoria ;)

Excelente explicaci�n!

te estoy sumamente agradecido.

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Rafael Bidegain
to Horacio Jamilis: Rafael Bidegain escribi�: Es correcto. Si, es necesario liberar el memorystream. Salvo…

El d�a 29 de septiembre de 2009 19:02, Horacio Jamilis <hjamilis en pymesoft.com.ar> escribi�:

Show quoted text 5 lines
> de paso te hago otra consulta respecto a tu solucion. > es necesario liberar la memoria del Stream luego de usarla? > yo la estoy liberando con Stream.free, pero me gustar�a estar seguro. Si, es necesario liberar el memorystream. Salvo que quieras agotar la memoria de la m�quina a prop�sito :-)

:) je je
gracias!

Show quoted text 8 lines
> en la primera linea de tu solucion me sugieres que no cargue la imagen > en un timage. > como me sugieres que lo haga? > Si la imagen est� en un archivo, la cargas directamente en le par�metro con LoadFromFile(Nombre del archivo de la imagen). Debiera funcionar.

y funciona, aunque tambien me pide el par�metro extra. muchas gracias!

ahora estoy en otro punto y creo haber tropezado con un bug. una vez que cargo las imagenes.
(prob� cargarlas con LoadFromFile, LoadFromStream y tambien desde el mysql con: insert into imagenes (imagen) values (load_file('/tmp/image.png'));

yo tengo en el formulario un datasource un dbgrid y un dbimage vinculo el dbimage y el dbgrid al mismo datasource, pero la aplicacion cancela cuando la propiedad autodisplay del dbgrid est� en true.

http://bugs.freepascal.org/view.php?id=12030

el error se genera tanto en las versiones 0.9.24 como en la version 0.9.26 Existe ese error en la actual stable del svn ?

al pie del reporte del bug veo que est�n pidiendo un proyecto que muestre el error, como hay que hacer para enviar un proyecto para ayudar a los desarrolladores ?
hay normas, convenciones, buenas costumbres etc etc ?

saludos

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

JoshyFun
to Rafael Bidegain

Hello Rafael,

Wednesday, September 30, 2009, 12:57:54 PM, you wrote:

RB> yo tengo en el formulario un datasource un dbgrid y un dbimage RB> vinculo el dbimage y el dbgrid al mismo datasource, pero la aplicacion RB> cancela cuando la propiedad autodisplay del dbgrid est� en true.

RB> http://bugs.freepascal.org/view.php?id=12030

RB> el error se genera tanto en las versiones 0.9.24 como en la version 0.9.26 RB> Existe ese error en la actual stable del svn ?

El c�digo sigue exactamente igual, as� que si, es muy probable que el error siga ah�, de hecho creo que se cual es el motivo, y me parece incre�ble que nadie se haya dado cuenta :-? Simplemente en la linea:

GraphExt := s.ReadAnsiString;

Se leen todos los datos de la imagen en una variable string y en:

gc := GetGraphicClassForFileExtension(GraphExt)

Se usan como si fuera el nombre de un archivo (en vez de sus datos binarios) para obtener el formato gr�fico :-(

Intentar� corregirlo y propondr� un parche.

RB> al pie del reporte del bug veo que est�n pidiendo un proyecto que RB> muestre el error, como hay que hacer para enviar un proyecto para RB> ayudar a los desarrolladores ?
RB> hay normas, convenciones, buenas costumbres etc etc ?

B�sicamente creas el proyecto lo m�s peque�o que puedas, eliminas las cosas no necesarias como el icono y cosas as� y lo envias todo en un zip. Se supone que todo lo que haya en el zip una vez descomprimido es suficiente para compilar la aplicaci�n (a ser posible que el error se produzca al pulsar un bot�n o algo as� y que tenga s�lo un form). En este caso al ser un problema de base de datos es mucho m�s complicado, pero ser�a hacer una app m�nima y enviar junto a la app una base de datos que muestre el problema y que contenga pocos registros.

Best regards, JoshyFun

Reply by email

JoshyFun
to Rafael Bidegain: El d�a 29 de septiembre de 2009 19:02, Horacio Jamilis <hjamilis en pymesoft.com.ar>…

Hello Rafael,

Wednesday, September 30, 2009, 12:57:54 PM, you wrote:

RB> yo tengo en el formulario un datasource un dbgrid y un dbimage RB> vinculo el dbimage y el dbgrid al mismo datasource, pero la aplicacion RB> cancela cuando la propiedad autodisplay del dbgrid est� en true. RB> http://bugs.freepascal.org/view.php?id=12030
RB> el error se genera tanto en las versiones 0.9.24 como en la version 0.9.26 RB> Existe ese error en la actual stable del svn ?

He propuesto un parche para la LCL
http://bugs.freepascal.org/view.php?id=14698 que no arregla ese problema, pero hace que solucionarlo sea una cosa trivial.

Te aconsejar�a que te pasaras a la 0.9.28 lo antes posible ya que vas a tener problemas para adaptar tu c�digo a unicode que es el sistema por defecto en los lazarus m�s recientes (ya sabes campos con acentos, �, y esas cosas). Cuanto m�s c�digo escribas en 0.9.26 m�s dif�cil se har� el paso a las versiones m�s recientes.

Best regards, JoshyFun

Reply by email

Rafael Bidegain
to JoshyFun: RB> yo tengo en el formulario un datasource un dbgrid y un dbimage RB> vinculo el dbimage…

El d�a 30 de septiembre de 2009 09:34, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 27 lines
Hello Rafael, Wednesday, September 30, 2009, 12:57:54 PM, you wrote: RB> yo tengo en el formulario un datasource un dbgrid y un dbimage RB> vinculo el dbimage y el dbgrid al mismo datasource, pero la aplicacion RB> cancela cuando la propiedad autodisplay del dbgrid est� en true. RB> http://bugs.freepascal.org/view.php?id=12030 RB> el error se genera tanto en las versiones 0.9.24 como en la version 0.9.26 RB> Existe ese error en la actual stable del svn ? El c�digo sigue exactamente igual, as� que si, es muy probable que el error siga ah�, de hecho creo que se cual es el motivo, y me parece incre�ble que nadie se haya dado cuenta :-? Simplemente en la linea: GraphExt := s.ReadAnsiString; Se leen todos los datos de la imagen en una variable string y en: gc := GetGraphicClassForFileExtension(GraphExt) Se usan como si fuera el nombre de un archivo (en vez de sus datos binarios) para obtener el formato gr�fico :-( Intentar� corregirlo y propondr� un parche.

Hice otra prueba, gener� un archivo dbf (usando tdbf) en este caso dbimage funciona muy bien.

procedure TForm1.Button1Click(Sender: TObject);
begin
  Dbf1.TableLevel := 7;
  Dbf1.TableName := 'image.dbf';
  With Dbf1.FieldDefs do begin
    Add('fimage', ftBlob, 65535, True);
  End;
  Dbf1.CreateTable;
  Dbf1.Active := true;
  Dbf1.insert;
  dbimage1.picture.LoadFromFile('/tmp/lazarus_about_logo.xpm');
  dbf1.post;
end;

el problema lo sigo teniendo con mysql, por lo que v� los programadores php encodean el string en base 64 antes de guardar la imagen en la tabla y lo decodean antes de mostrar la imagen. pasar� por all� la soluci�n ?

Estoy buscando funciones encode64 y decode64 en mysql pero no las encuentro, si consigo eso me ahorraria encodear el stream en freepascal (cosa que encuentro engorrosa viendo el ejemplo http://ejemplos.mis-algoritmos.com/index/view/257 )

saludos

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Rafael Bidegain
to JoshyFun: RB> yo tengo en el formulario un datasource un dbgrid y un dbimage RB> vinculo el dbimage…

El d�a 30 de septiembre de 2009 14:55, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 14 lines
Hello Rafael, Wednesday, September 30, 2009, 12:57:54 PM, you wrote: RB> yo tengo en el formulario un datasource un dbgrid y un dbimage RB> vinculo el dbimage y el dbgrid al mismo datasource, pero la aplicacion RB> cancela cuando la propiedad autodisplay del dbgrid est� en true. RB> http://bugs.freepascal.org/view.php?id=12030 RB> el error se genera tanto en las versiones 0.9.24 como en la version 0.9.26 RB> Existe ese error en la actual stable del svn ? He propuesto un parche para la LCL http://bugs.freepascal.org/view.php?id=14698 que no arregla ese problema, pero hace que solucionarlo sea una cosa trivial.

�te aceptar�n un parche que no soluciona el problema?

Show quoted text 6 lines
Te aconsejar�a que te pasaras a la 0.9.28 lo antes posible ya que vas a tener problemas para adaptar tu c�digo a unicode que es el sistema por defecto en los lazarus m�s recientes (ya sabes campos con acentos, �, y esas cosas). Cuanto m�s c�digo escribas en 0.9.26 m�s dif�cil se har� el paso a las versiones m�s recientes.

si, es lo que voy a hacer en los proximos d�as.

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

JoshyFun
to Rafael Bidegain

Hello Rafael,

you wrote
> He propuesto un parche para la LCL > http://bugs.freepascal.org/view.php?id=14698 que no arregla ese > problema, pero hace que solucionarlo sea una cosa trivial.

RB> �te aceptar�n un parche que no soluciona el problema?

Si, probablemente no tal y como yo lo he escrito, pero si, lo que no se es cuando.

De todos modos estoy pensando en rehacerlo de otro modo para que se pueda aplicar a fpc principalmente y que la LCL salga beneficiada de modo "indirecto".

Best regards, JoshyFun

Reply by email

JoshyFun
to Rafael Bidegain: El d�a 30 de septiembre de 2009 09:34, JoshyFun <joshyfun en gmail.com> escribi�:…

Hello Rafael,

Thursday, October 1, 2009, 5:40:23 PM, you wrote:

RB> procedure TForm1.Button1Click(Sender: TObject);
RB> begin
RB>   Dbf1.TableLevel := 7;
RB>   Dbf1.TableName := 'image.dbf';
RB>   With Dbf1.FieldDefs do begin
RB>     Add('fimage', ftBlob, 65535, True);
RB>   End;
RB>   Dbf1.CreateTable;
RB>   Dbf1.Active := true;
RB>   Dbf1.insert;
RB>   dbimage1.picture.LoadFromFile('/tmp/lazarus_about_logo.xpm');
RB>   dbf1.post;
RB> end;
RB> el problema lo sigo teniendo con mysql, por lo que v� los
RB> programadores php encodean el string en base 64 antes de guardar la
RB> imagen en la tabla y lo decodean antes de mostrar la imagen.
RB> pasar� por all� la soluci�n ?

Si el BDImage lo "rellenas" con un LoadFromFile no hay problema ya que el formato del gr�fico se saca de la extensi�n del fichero. C�mbiale la extensi�n al fichero (no lo cambies de formato) y haz lo mismo, ver�s que te salta un error por que la extensi�n no concuerda con los datos contenidos. Cuando lees de un Blob no hay extensi�n que analizar y por lo tanto creo que por defecto asume que es un BMP.

Lo de Base64 no suele ser necesario en los Blobs, aunque no se en los de MySQL (no uso por su licencia). Eso si, el Blob tiene que ser binario no texto.

Best regards, JoshyFun

Reply by email

Rafael Bidegain
to JoshyFun

El d�a 1 de octubre de 2009 13:29, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 29 lines
Hello Rafael, Thursday, October 1, 2009, 5:40:23 PM, you wrote: RB> procedure TForm1.Button1Click(Sender: TObject); RB> begin RB> � Dbf1.TableLevel := 7; RB> � Dbf1.TableName := 'image.dbf'; RB> � With Dbf1.FieldDefs do begin RB> � � Add('fimage', ftBlob, 65535, True); RB> � End; RB> � Dbf1.CreateTable; RB> � Dbf1.Active := true; RB> � Dbf1.insert; RB> � dbimage1.picture.LoadFromFile('/tmp/lazarus_about_logo.xpm'); RB> � dbf1.post; RB> end; RB> el problema lo sigo teniendo con mysql, por lo que v� los RB> programadores php encodean el string en base 64 antes de guardar la RB> imagen en la tabla y lo decodean antes de mostrar la imagen. RB> pasar� por all� la soluci�n ? Si el BDImage lo "rellenas" con un LoadFromFile no hay problema ya que el formato del gr�fico se saca de la extensi�n del fichero. C�mbiale la extensi�n al fichero (no lo cambies de formato) y haz lo mismo, ver�s que te salta un error por que la extensi�n no concuerda con los datos contenidos. Cuando lees de un Blob no hay extensi�n que analizar y por lo tanto creo que por defecto asume que es un BMP.

eso est� claro.

lo que ocurre es que tengo otro boton que hace
procedure TForm1.Button3Click(Sender: TObject);
begin
  Dbf1.Active := true;
  Dbf1.first;
end;
y ahora si, leo la imagen directamente del campo sin problemas.
Lo de Base64 no suele ser necesario en los Blobs, aunque no se en los de MySQL (no uso por su licencia).

� cual es el el problema de la licencia de mysql ?, mysql se distribuye con varias licencias dicho sea de paso. tu puedes usar la que mejor te parezca.

Eso si, el Blob tiene que ser binario no texto.

mmm, lo extra�o es que los archivos xpm son texto y en el dbf se ven bien. quiz�s sea un problema para mysql (ahora estoy probando insertar con compress(image) y recuperar con uncompress(image)

saludos

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email