PDA

Ver la Versión Completa : Guardar una imagen a una base de datos en mySQL


Elqui
15-12-2009, 15:23:29
Tengo una tabla, en MySQL, para guardar datos de personas (nombres, apellidos, ..., foto). El campo foto es tipo BLOB.

Para actualizar la tabla desde un form, he ligado la tabla a un DataSource al cual están ligados los DBEdit de los campos. Para el campo foto uso un DBImage.

El codigo para actualizar la tabla es el siguiente:

begin
Tabla1.Edit; //abrir la tabla en modo edición
TOpenPictureDialog1.Execute; //Seleccionar la imagen de un directorio
TDBImage1.Picture.LoadFromFile(TOpenPictureDialog1.FileName); //cargar
Tabla1.Post; //guardar los datos en la tabla
end;

El código se ejecuta correctamente hasta llegar a la última línea (Tabla1.Post;) que es donde me salta el siguiente error: "No se puede encontrar la fila para su actualización: algunos valores han cambiado desde la última vez que se leyó"

Los demas campos de la tabla(nombres, apellidos, etc.) si son actualizados pero el campo foto no lo actualiza.

Agradezco puedan ayudarme a solucionar este error.

radenf
15-12-2009, 20:52:15
Estimado Elqui :

Yo utilizo el siguiente código y funciona perfecto

if DataSetEdit1.Execute then
if OpenPictureDialog1.Execute then
EDBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
DataSetRefresh1.Execute;
end;

Esto te permitirá ingresar en la base de datos imágenes BMP. Para ingresar imágenes en formato Jpeg deberías usar los componentes EDBImage 1.6 de Sebastián Mayora o el JvEDBImage de las librerías Jedi.

Saludos y suerte

Elqui
15-12-2009, 21:00:35
Efectivamente, necesito guardar imagenes JPG, buscaré los componentes que me indicas y luego probaré con el código que has puesto.

radenf
15-12-2009, 21:38:37
El EDBImage 1.6 funciona sólo hasta Delphi 7.
Las Jedi entiendo que hasta Delphi 2009.
Yo uso Delphi 2007 y tengo una versión de EDBImage 1.6 compilada para esta versión,que al instalarla tira algunos errores, pero al final funciona. Si fuera esta la versión que requieres te la podría enviar por mail privado.

Salu2

heroe
16-12-2009, 09:38:44
Te recomiendo que uses un campo tipo longblob.

Ejemplo guardar una imagen

Donde

_Imagen es una variable stream
imgImagen es un TImage
ADOQuery1 es TADOQuery

_Imagen := TMemoryStream.Create;
imgImagen.Picture.LoadFromFile(OpenPictureDialog1.FileName);
_Imagen.LoadFromFile(OpenPictureDialog1.FileName);

with ADOQuery1 do
begin
SQL.Add('Insert into Tabla');
SQL.Add('(Imagen)');
SQL.Add('Values(:Param0)');
with Parameters do
Items[0].LoadFromStream(_Imagen, ftBlob);
ExecSQL;
end;

_Imagen.Free;

vinicc
18-12-2009, 01:05:11
hola ! quiero comentarte que una vez me pasó lo mismo pero incrementando el tamaño del campo se solucionó el problema. Por otraparte utilizo una forma diferente de colocar la imagen y se debe a las especificaciones del cliente. Lo que hago es lo siguiente:

el operador coloca la imágen en el buffer de memoria (copiar) y luego pulsa un botón y la imagen se "pega" en el campo.

if dbset.CoCfg.State <> dsEdit then dbset.CoCfg.Edit;
Logo.PasteFromClipboard;

Luego el usuario decide si cancela o guarda los cambios efectuados. Logo es un TDBImage