Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Se pueden almacenar imágenes en una BD en Access?? (https://www.clubdelphi.com/foros/showthread.php?t=23887)

oracle 01-08-2005 18:15:53

Se pueden almacenar imágenes en una BD en Access??
 
Estoy trabajando con Access (2003) y me gustaría saber si se pueden almacener imágenes y de ser posible cómo se hace...Estuve mirando un tipo de dato (El OLE Object) parece que ahí está la cosa pero no se me ocurre como utilizarlo.
Probe pasarle la dirección de una imagen y la adicionaba a la BD pero cuando accedí desde una aplicación y traté de cargar los datos en un DBImage me decia que eran incompatibles los tipos.

Cualquier sugerencia al respecto la agradeceré

/*Saludos*/

Neftali [Germán.Estévez] 02-08-2005 10:40:19

Sí se puede.
Aquí lo tienes explicado paso a paso. Leete el artículo completo. Explica varias formas de hacerlo y porque cada una de ellas es correcta o no.

http://delphi.about.com/od/database/l/aa030601a.htm

oracle 02-08-2005 14:18:28

Gracias
 
Gracias Neftali veo que la solución estaba ante mis narices, para la próxima garantizo buscar bien antes de preguntar. Sin embargo ya he hecho todos los pasos y me da un error en tiempo de ejecución que no logro depurar por ningún lado. Este es el error: Stream read error. La aplicación no explota ni nada de eso tan solo muestra este error y ya. Echale un vistazo al código como me quedo, casi igual que el ejemplo que me dices...

....................
const
JPEGstarts = 'FFD8';
BMPstarts = '424D'; //BM

var
Form1: TForm1;
implementation
uses jpeg;
{$R *.dfm}
procedure TForm1.btnShowImageClick(Sender: TObject);
var
bS : TADOBlobStream;
Pic : TJpegImage;
begin
bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
try
bS.Seek(JpegStartsInBlob(AdoTable1Picture),soFromBeginning);
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
finally
Pic.Free;
end;
finally
bS.Free
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1Picture.SaveToFile('BlobImage.dat');
end;
function TForm1.JpegStartsInBlob(PicField: TBlobField): integer;
var
bS : TADOBlobStream;
buffer : Word;
hx : string;
begin
Result := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
try
while (Result = -1) and
(bS.Position + 1 < bS.Size) do
begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'FF' then begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'D8' then Result := bS.Position - 2
else if hx = 'FF' then
bS.Position := bS.Position-1;
end; //if
end; //while
finally
bS.Free
end; //try
end;

end.

Neftali [Germán.Estévez] 02-08-2005 15:24:16

Utiliza TAG´s en el código Delphi, verás como se vuelve más legible.
http://www.clubdelphi.com/foros/misc.php?do=bbcode

Mira la diferencia (Delphi -entre corchetes- al empezar y /Delphi -entre corchetes- al acabar):

Código Delphi [-]
     const
    JPEGstarts = 'FFD8';
    BMPstarts = '424D';  //BM
   
   var
     Form1: TForm1;
   implementation
   uses jpeg;
   {$R *.dfm}
   procedure TForm1.btnShowImageClick(Sender: TObject);
   var
     bS  : TADOBlobStream;
     Pic : TJpegImage;
   begin
     bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
     try
       bS.Seek(JpegStartsInBlob(AdoTable1Picture),soFromBeginning);
       Pic:=TJpegImage.Create;
       try
        Pic.LoadFromStream(bS);
        ADOImage.Picture.Graphic:=Pic;
       finally
        Pic.Free;
       end;
     finally
       bS.Free
     end;
   end;
    
   procedure TForm1.FormCreate(Sender: TObject);
   begin
     ADOTable1Picture.SaveToFile('BlobImage.dat');
   end;
   function TForm1.JpegStartsInBlob(PicField: TBlobField): integer;
   var
    bS     : TADOBlobStream;
    buffer : Word;
    hx     : string;
   begin
    Result := -1;
    bS := TADOBlobStream.Create(PicField, bmRead);
    try
     while (Result = -1) and
           (bS.Position + 1 < bS.Size) do
     begin
      bS.ReadBuffer(buffer, 1);
      hx:=IntToHex(buffer, 2);
      if hx = 'FF' then begin
        bS.ReadBuffer(buffer, 1);
        hx:=IntToHex(buffer, 2);
        if hx = 'D8' then Result := bS.Position - 2
        else if hx = 'FF' then
          bS.Position := bS.Position-1;
      end; //if
     end; //while
    finally
     bS.Free
    end;  //try
   end;
   
   end.

oracle 02-08-2005 16:13:55

Código Delphi [-]
 OK, entendí el mensaje pero aún no doy con el error...

Neftali [Germán.Estévez] 02-08-2005 17:06:44

A mi me funciona perfectamente tu código.
He guardado añadido una imagen a la Base de Datos con el código que aparece al final de la página:
http://delphi.about.com/library/code/ncaa030601a.htm

Y luego la visualizo correctamente con el código que has puesto.

oracle 02-08-2005 17:11:54

OK, de todos modos revisaré todo otra vez, quizás el problema esté en la BD o en el formato de la imagen que he guardado quizás no sea compatible.

Muchas gracias

/*oracle*/


La franja horaria es GMT +2. Ahora son las 16:13:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi