La Web del Programador: Comunidad de Programadores
 
    Pregunta:  53354 - GUARDAR IMAGEN EN MYSQL UTILIZANDO SOLO CODIGO
Autor:  Jose Vinicio Rivera Miranda
Hola.
He estado buscando informacion sobre como guardar imagenes en mysql con delphi, pero la mayoria de info que encuento utilizan tquery o ttable, yo no utilizo estos componentes sino que todo lo hago con codigo desde la conexion hasta los recordsets para las consultas sql, hasta ahora no he tenido ningun contratiempo, pero no se como agregar una imagen sin utilizar componentes. Estos son los codigos que utilizo:

para guardar informacion utilizo algo como esto:

procedure TForm1.AddBank;
var
SqlText: string;
RsCon: _Recordset;
begin
SqlText := 'SELECT * FROM Banks';
RsCon := coRecordSet.Create;
RsCon.Open(SqlText,Form1.AdoCon,adOpenDynamic,adLockOptimistic,adCmdText);

RsCon.AddNew(EmptyParam,EmptyParam);
RsCon.Fields.Item['BankName'].Value := Form1.BankName.Text;
RsCon.Fields.Item['BankCity'].Value := Form1.BankCity.Text;
RsCon.Fields.Item['BankAddress'].Value := Form1.BankAddress.Text;
RsCon.Fields.Item['BankTelephone'].Value := Form1.BankTelephone.Text;
RsCon.Fields.Item['BankContact'].Value := Form1.BankContact.Text;
RsCon.Fields.Item['BankBalance'].Value := Form1.BankBalance.Text;
RsCon.Update(EmptyParam,EmptyParam);
RsCon := nil;
end;

en un procedimiento parecido al anterior quiero colocar el campo donde iria la imagen, solo se que es un campo blob, pero lo he intentado de varias formar pero no he podido lograrlo, que tendria que agragarle a este codigo para que guardara en un campo blob

  Respuesta:  Erwin Alejandro Perez Escobedo
Te comento que me tope con el mismo problema trabajando con SQLite, usando solo consultas SQL. La solucion: convierte a texto la imagen.
Hay 2 cosas que se tienen que hacer:
1.- tomas la imagen y la escribes (TGraphic.SavetoStream) a un TStringStream.
2.- Lees el texto del TStringStream con la propiedad DataString, el texto representara la imagen.

3.- *Opcional* puedes codificar la imagen con _UUEncode (Viene en las librerias del JEDI) para que el texto lo puedas usar en consultas SQL. En tu caso podrias intentar primero asignarle al campo el valor obtenido en el paso anterior.

Para recuperar la foto (apuesto a que ya la imaginaste):
1.- Lees del campo el texto que representa la foto.
2.- Si lo codificaste en UU lo decodificas con _UUDecode.
3.- Lo escribes en un TStringStream con WriteString.
4.- usas un TJPGImage o un TBitMap segun sea el caso para cargar desde el TStringStream la imagen (LoadFromStream).
Voilá, ya tienes de nuevo tu imagen.
Si quieres mostrarla no hay mas que
Image1.Picture.Graphic:=MiImagen;

Nota: El proceso de codificacion y decodificacion en UU es muuy lento, si puedes evitarlo evitalo. He podido guardar imagenes hasta de 300x300 a una velocidad razonable (<500ms) pero con una de 1024x768 se llego a tardar hasta 10s para codificar o decodificar, por el contrario, la lectura/escritura en el stream fue realmente rapida para cualquier tamaño de imagen.

Que tengas buena tarde y espero te sirva.