PDA

Ver la Versión Completa : guardar imagen en campo blob


edgar_prospero
30-10-2012, 18:42:24
que hay amigos tengo un sistema donde voy agregando productos a una base de datos mysql, pero tengo un problema a cada producto quiero agregar una imagen, me gustaria saber que componentes o que necesito para lograrlo, ojala me puedan orientar un poco. para ir guardando lo demas utilizo el siguiente codigo:

tabla.SQL.Clear;
tabla.Close;
tabla.SQL.Add('insert into clientes(codigo, nombre, direccion, comentarios)values(:pcodigo, :pnombre, :pdireccion, :pcomentarios) on duplicate key update nombre=:pnombre, direccion=:pdireccion, comentarios=:pcomentarios');
tabla.ParamByName('pcodigo').AsString:=codigo.Text;
tabla.ParamByName('pnombre').AsString:=nombre.Text;
tabla.ParamByName('pdireccion').AsString:=direccion.Text;
tabla.ParamByName('pcomentarios').Asstring:=comentarios.Text;

tabla.Execute;
nombre.Clear;
nombre.Clear;
direccion.Clear;
comentarios.Clear;


query.Close;
query.SQL.Text:='SELECT codigo FROM clientes ORDER BY codigo desc LIMIT 1';
query.Open;
codigo.text := IntToStr(query.FieldByName('codigo').asInteger +1) ;
nombre.SetFocus;
nombre.SelectAll;

//tabla.SQL.Clear;

showmessage('grabado con exito ');

ecfisa
30-10-2012, 18:59:39
Hola edgar.

Primeramente necesitas crear un campo de tipo blob en la tabla productos para que así puedas almacenar la imágenes correspondientes.

Al pié de esta página tenes varios enlaces relacionados a tu consulta, y creo que este [Guardar una imagen a una base de datos en mySQL (http://www.clubdelphi.com/foros/showthread.php?t=65443)], también te puede ser útil.

Saludos. :)

edgar_prospero
30-10-2012, 19:11:12
gracias por responder, si el campo ya lo cree, algo que me falto especificar es que quiero mediante un boton se abra para buscar la imagen a guardar

ecfisa
30-10-2012, 19:41:36
Hola Edgar.

Podrías usar un TOpenPictureDialog para buscar la imágen y luego en el evento OnClick del botón, hacer algo como por ejemplo:

...
uses jpeg;

procedure TForm1.Button1Click(Sender: TObject);
var
Jpg : TJPEGImage;
begin
if OpenPictureDialog1.Execute then
begin
Jpg := TJPEGImage.Create;
try
Jpg.LoadFromFile(OpenPictureDialog1.FileName);
DataSet.Edit;
DataSet.FieldByName('CAMPO_BLOB').Assign(Jpg);
finally
Jpg.Free;
end;
end;
end;

No utilizo MySQL, pero en Firebird guarda la imágen jpg sin problemas.

Saludos.

ecfisa
30-10-2012, 19:59:40
Hola de nuevo.

Se me escapó, que tal vez tengas otros tipos que jpg... :o

Proba de esta forma:

...
uses jpeg;

procedure TForm1.Button1Click(Sender: TObject);
var
Pic : TPicture;
begin
if OpenPictureDialog1.Execute then
begin
Pic := TPicture.Create;
try
Pic.LoadFromFile(OpenPictureDialog1.FileName);
DAtaSet.Edit;
DataSet.FieldByName('CAMPO_PBLOB').Assign(Pic);
finally
Pic.Free;
end;
end;
end;


Saludos.

edgar_prospero
30-10-2012, 20:11:26
gracias por tu respuesta.

no se en que cambie firebird a mysql pero con este procedimiento no me marca ningun error, pero no me esta guardando nada en la base de datos

Casimiro Notevi
30-10-2012, 20:22:08
Quizás falte el post
DataSet.FieldByName('CAMPO_PBLOB').Assign(Pic);
DataSet.Post;

ecfisa
30-10-2012, 21:06:32
Quizás falte el post
DataSet.FieldByName('CAMPO_PBLOB').Assign(Pic);
DataSet.Post;

Exáctamente.^\||/

No lo agregué allí por que supuse que tenía más campos y realizaba el guardado al finalizar la carga de los datos.

Saludos.:)

martini002
14-11-2012, 18:51:36
Saludos Amigos,
Tengo 2 dias luchando con esto,
intentando guardar una imagen en una tabla de una BD
tengo una tabla precisa con campos NumeroConductor e Imagen
la ultima de tipo Blob, he tratado de modificar cuanto codigo he visto
pero sin ningun exito hasta ahora, intente con Stream, y no funciono,
ahora estoy intentando con tu codigo Ecfisa y no estoy muy seguro
de como adaptarlo, estoy usando ZEOS 7 + SQLite + D2010

mira un pedazito de mi codigo:

Justo ahorita intento con este, tratando de asignar al campo Blob la imagen,
pero me da un error, diciendo que no consigue el campo Imagen :S

ZQuery1.Close;
ZQuery1.SQL.Text:= 'Insert Into ImagenesConductores Values ('+IntToStr(NumeroConductor)+', :Imagen)';
ZQuery1.FieldByName('Imagen').Assign(Image1);
ZQuery1.ExecSQL;

Y este otro intentando con asignacion de Stream, pero sin exito,
me da un error, Unrecognized token: "'" Creo que es con el SQLite me parece

_Imagen := TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(_Imagen);

ZQuery1.Close;
ZQuery1.SQL.Text:= 'Insert Into ImagenesConductores Values ('+IntToStr(NumeroConductor)+', :Image)';
ZQuery1.Params.Items[0].LoadFromStream(_Imagen, ftBlob);
ZQuery1.ExecSQL;

Les agradezco muchisimo su ayuda, estoy nuevo con esto y apenas es mi primer intento
usando campos de tipo Blob. Saludos

martini002
14-11-2012, 19:34:47
Estuve probando este codigo,
aunque no me da ningun error tampoco hace nada :/
crea un registro null en la BD inclusive en el campo Blob

Var
JPG:TPicture;

Begin
Jpg:= TPicture.Create;
Jpg.LoadFromFile(OpenPictureDialog1.Filename);

ZQuery2.Open;
ZQuery2.Edit;
ZQuery2.FieldByName('Imagen').Assign(Jpg);
ZQuery2.Post;

end


Edito:
De hecho no es el mismo orden en el que lo tengo,
pero si estoy seguro que carga la imagen a la variable Jpg
porque a su vez lo hace con un TImage

ecfisa
14-11-2012, 20:47:22
Hola martini002.

Tal vez SQLite requiera algún tratamiendo diferente, no lo conozco. Pero revisa si en estos enlaces encontras algo que sirva:

Campo BLOB en BD SQLITE version 3.7 (http://www.clubdelphi.com/foros/showthread.php?t=75920)
A simple Delphi wrapper for Sqlite 3 (http://www.itwriting.com/blog/articles/a-simple-delphi-wrapper-for-sqlite-3)
BLOB example (http://forums.indasoftware.com/topic/14/blob-example/)
Mass insert of images in BLOB fields... (http://sqliteexpert.com/forum/YaBB.pl?num=1343256973/0)


Saludos. :)