Ver Mensaje Individual
  #8  
Antiguo 18-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lizette,

No sé si pueda guardarse una imagen en un campo de tipo VarChar, en todo caso, no me parece el más indicado. Sería mejor que optaras por un campo BLOB (LongBlob, MediumBlob, TinyBlob, etc., dependiendo del tamaño de tus imágenes).

Te pongo aquí unas rutinas para guardar y mostrar imágens en una base MySQL usando un ADOTable:

Código Delphi [-]
// Guardar una imagen
var
    Stream: TStringStream;

begin
    Stream := TStringStream.Create('');

    try
        Image1.Picture.Graphic.SaveToStream(Stream);

        AdoTable1.Append;
        AdoTable1.FieldByName('titulo').AsString := 'Mi primera foto';
        AdoTable1.FieldByName('foto').AsString := Stream.DataString;
        AdoTable1.Post;
    finally
        Stream.Free;
    end;
end;

// Mostrar la imagen
var
    Stream: TStringStream;
    Bitmap: TBitmap;

begin
    Bitmap := nil;
    Stream := nil;

    try
        Bitmap := TBitmap.Create;
        Stream := TStringStream.Create(AdoTable1.FieldByName('foto').AsString);

        Bitmap.LoadFromStream(Stream);
        Image1.Picture.Assign(Bitmap);
    finally
        Bitmap.Free;
        Stream.Free;
    end;
end;

Las rutinas equivalentes usando un AdoQuery

Código Delphi [-]
// Guardar una imagen
var
    Stream: TStringStream;

begin
    Stream := TStringStream.Create('');
    try
        Image1.Picture.Graphic.SaveToStream(Stream);

        AdoQuery1.SQL.Text := 'insert into fotos (titulo, foto) values(:titulo, :foto)';
        AdoQuery1.Parameters.ParamByName('titulo').Value := 'Mi primera foto';
        AdoQuery1.Parameters.ParamByName('foto').Value := Stream.DataString;
        AdoQuery1.ExecSQL;
    finally
        Stream.Free;
    end;
end;

// Mostrar la imagen
var
    Stream: TStringStream;
    Bitmap: TBitmap;

begin
    Bitmap := nil;
    Stream := nil;

    try
        Bitmap := TBitmap.Create;

        AdoQuery1.SQL.Text := 'select titulo, foto from fotos where id = :id';
        AdoQuery1.Parameters.ParamByName('id').Value := 8;
        AdoQuery1.Open;

        Stream := TStringStream.Create(AdoQuery1.FieldByName('foto').AsString);

        Bitmap.LoadFromStream(Stream);
        Image1.Picture.Assign(Bitmap);
    finally
        Bitmap.Free;
        Stream.Free;
    end;
end;

Veo más conveniente usar un AdoQuery, sobre todo para obtener la imagen desde la base de datos; porque usar un AdoTable implicaría, como dice rgstuamigo, demasiado tráfico. Lo normal sería, mostrar una lista de registros y que el usuario escoja de cual quiere ver la imagen, y sólo entonces descargas la foto.

// Saludos
Responder Con Cita