Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Insertar múltiples bitmaps en BD Access (https://www.clubdelphi.com/foros/showthread.php?t=84543)

radenf 01-11-2013 14:56:26

Insertar múltiples bitmaps en BD Access
 
Hola amigos :

Necesito insertar en una BD Access múltiples imágenes(.bmp) en diferentes registros, en un sólo paso.
Utilizo el siguiente código, que a pesar de encontrarse en un ciclo for, inserta sólo la última imagen en la BD. Este código es una parte de otro más extenso, que permite simultáneamente insertar otros valores en la BD, aparte de las imágenes, lo cual realiza sin problemas. Lo único que no logro insertar son la totalidad de las imágenes requeridas.

Código Delphi [-]
var
I: Integer;
Bitmap1: TBitmap;
dd1: TDicomDataset;
AStream : TStream;
begin
for I := 0 to ListBox2.Items.Count - 1 do
begin
dd1:= TDicomDataset.Create;
dd1.LoadFromFile(ListBox2.Items.Strings[i]);
Bitmap1 := TBitmap.Create;
dd1.Attributes.ImageData.AssignToBitmap(Bitmap1,False);
Redimensionar(Bitmap1,80,80);
try
Data1.TablaSeries.Edit;
AStream:= Data1.TablaSeries.CreateBlobStream(Data1.TablaSeries.FieldByName('SERIES_ICON'), bmWrite);
Bitmap1.SaveToStream(AStream);
finally
Bitmap1.Free;
AStream.Free;
end;

Utilizo Edit y no Insert, porque los registros ya existen y sólo se debe agregar información en algunos campos específicos.
Si incluyo un ciclo while para la inserción de las imágenes me genera el error de que la TablaSeries no se encuentra en estado de edición, a pesar de estarlo (Data1.TablaSeries.Edit).
ListBox2 contiene los registros a los que se apuntan en la BD, obtenidos a partir de un Query.
dd1 es un DatasetDicom, a partir del cual, por sus atributos, se generan los bitmaps.
Redimensionar es un procedimiento publicado en el foro por Seoane, que permite justamente eso, redimensionar los bitmaps, los que finalmente pesan sólo 25Kb.

Agradezco de antemano cualquier ayuda.

Saludos y muchas gracias

Casimiro Notevi 01-11-2013 15:20:10

Faltan dos end;
Código Delphi [-]
var
  I: Integer;
  Bitmap1: TBitmap;
  dd1: TDicomDataset;
  AStream : TStream;
begin
  for I := 0 to ListBox2.Items.Count - 1 do
  begin
    dd1:= TDicomDataset.Create;
    dd1.LoadFromFile(ListBox2.Items.Strings[i]);
    Bitmap1 := TBitmap.Create;
    dd1.Attributes.ImageData.AssignToBitmap(Bitmap1,False);
    Redimensionar(Bitmap1,80,80);
    try
      Data1.TablaSeries.Edit;
      AStream:= Data1.TablaSeries.CreateBlobStream(Data1.TablaSeries.FieldByName('SERIES_ICON'), bmWrite);
      Bitmap1.SaveToStream(AStream);
    finally
      Bitmap1.Free;
      AStream.Free;
    end;
  end;
end

radenf 01-11-2013 15:41:33

Muchas gracias por responder Casimiro Notevi.

En realidad no faltan los end, porque como señalé este código es parte de otro, que no quise incluir, por lo extenso y porque realiza otras operaciones que funcionan bien, el cual contiene los end al final.
De hecho no obtengo ningún error al compilar, sólo que no inserta la cantidad debida de imágenes en la BD y que es lo que necesito.

Salu2

radenf 01-11-2013 18:33:44

Corrijo el código, el que he asignado a un Thread, para evitar confusiones.

Código Delphi [-]
procedure TVisor.BMDThread2Execute(Sender: TObject; Thread: TBMDExecuteThread; var Data: Pointer);
var
I: Integer;
Bitmap1: TBitmap;
dd1: TDicomDataset;
AStream : TStream;
begin
for I := 0 to ListBox2.Items.Count - 1 do
begin
try
dd1:= TDicomDataset.Create;
dd1.LoadFromFile(ListBox2.Items.Strings[i]);
Bitmap1 := TBitmap.Create;
dd1.Attributes.ImageData.AssignToBitmap(Bitmap1,False);
Redimensionar(Bitmap1,80,80);
Data1.TablaSeries.Edit;
AStream:= Data1.TablaSeries.CreateBlobStream(Data1.TablaSeries.FieldByName('SERIES_ICON'), bmWrite);
Bitmap1.SaveToStream(AStream);
finally
Bitmap1.Free;
AStream.Free;
Data1.TablaSeries.Post;
end;
end;
end;

Espero que alguien pueda descubrir el problema.
Salu2

radenf 01-11-2013 21:46:07

Me respondo yo mismo.
Encontré la solución, insertando las imágenes mediante un Update con ADOQuery y utilizando parámetros, con el siguiente código, el que adjunto por si alguien más pudiera servirle:

Código Delphi [-]
var
I: Integer;
Bitmap1: TBitmap;
dd1: TDicomDataset;
AStream : TStream;
begin
for I := 0 to ListBox2.Items.Count - 1 do
begin
dd1:= TDicomDataset.Create;
dd1.LoadFromFile(ListBox2.Items.Strings[i]);
Bitmap1 := TBitmap.Create;
dd1.Attributes.ImageData.AssignToBitmap(Bitmap1,False);
Redimensionar(Bitmap1,80,80);
Data1.TablaSeries.Edit;
try
AStream:= TMemoryStream.Create;
Bitmap1.SaveToStream(AStream);
ADOQuery9.Close;
ADOQuery9.SQL.clear;
ADOQuery9.SQL.add('update SERIES set SERIES_NUMBER =:SERIESN, SERIES_IMAGE_COUNT =:IMAGEN, SERIES_ICON =:ICON');
ADOQuery9.SQL.Add ('where SERIESUID like'+ QuotedStr(ListBox3.Items.Strings[i]+'%'));
ADOQuery9.Parameters.Parambyname('SERIESN').Value:= dd1.Attributes.getInteger($0020, $0011);
ADOQuery9.Parameters.Parambyname('IMAGEN').Value:= ListBox4.Items.Strings[i];
ADOQuery9.Parameters.ParamByName('ICON').LoadFromStream(AStream, ftBlob);
ADOQuery9.ExecSQL;
Data1.TablaSeries.Post;
finally
Bitmap1.Free;
AStream.Free;
end;
end;
end;

Saludos


La franja horaria es GMT +2. Ahora son las 19:05:00.

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