PDA

Ver la Versión Completa : Ayuda Error Campo tipo Imagen SQL


steelha
23-11-2022, 15:51:19
Buenas, espero todos estén bien. Tengo una tabla (PACIETNES) en la cual tengo un campo (pxfoto) de tipo IMAGE, esto es en SQL SERVE 2014 utilizando Delphi XE7/10. Tengo los siguientes procedimientos :

procedure TfrmPacientes.cargar_imagen;
Var
bmp: TBitmap; Stream: TStream;
bs : TMemoryStream;
begin
with DM.QryPacientes do
begin
Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmWrite);
imgfoto.Picture.Graphic.SaveToStream(Stream);
Stream.Free;
end;
end;

procedure TfrmPacientes.mostrar_imagen;
var
Stream: TStream;
begin
Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmRead);
Stream.Seek(0, soFromBeginning);
imgfoto.Picture.Graphic.LoadFromStream(Stream);
Stream.Destroy;
end;

Al guardar el campo no tengo problema, incluso veo que el campo pasa de null a <Datos binarios>, pero cuando quiero mostrar la imagen justo en donde marque como rojo da un error. lo intente con bitmap y da mensaje de error de bitmap no valid; si lo dejo con graphic da un error adress violation adress 00700EDA.

Si pueden ayudarme con este problema. se los agradecere.

duilioisola
23-11-2022, 17:12:43
Yo cargo así las imágenes con el siguiente procedimiento.
Supongo que en tu caso Formato debería ser 'BMP'.
Lo importante es que creo un bitmap para leer el stream. Luego asigno ese Bitmap a la imagen.


/// Imagen es un componente tipo TImage en el formulario.
/// Stream es un stream que leo de un campo BLOB que contiene una imagen.
/// Formato es el tipo de codificacion de la imagen.

procedure TDMMain.CargarImagenDeStream(Imagen: TImage; Stream: TStream; Formato: string);
var
BMP : TBitMap;
JPG : TJpegImage;
GIF : TGIFImage;
PNG : TPNGGraphic;
begin
if Formato = 'BMP' then
begin
BMP := TBitmap.Create;
try
BMP.LoadFromStream(Stream);
Imagen.Picture.Assign(BMP);
finally
BMP.Free;
end;
end
else
if Formato = 'JPG' then
begin
JPG := TJpegImage.Create;
try
JPG.LoadFromStream(Stream);

BMP := TBitmap.Create;
try
BMP.Assign(JPG);
Imagen.Picture.Assign(BMP);
finally
BMP.Free;
end;
finally
JPG.Free;
end;
end
else
if Formato = 'GIF' then
begin
GIF := TGIFImage.Create;
try
GIF.LoadFromStream(Stream);
Imagen.Picture.Assign(GIF);
finally
GIF.Free;
end;
end
else
if Formato = 'PNG' then
begin
PNG := TPNGGraphic.Create;
try
PNG.LoadFromStream(Stream);
Imagen.Picture.Assign(PNG);
finally
PNG.Free;
end;
end;
end;

duilioisola
23-11-2022, 17:18:02
Recuerda también utilizar bloques TRY..FINALLY para evitar que queden cosas abiertas si algo falla.


procedure TfrmPacientes.cargar_imagen;
Var
bmp: TBitmap; Stream: TStream;
bs : TMemoryStream;
begin
with DM.QryPacientes do
begin
Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmWrite);
try {<---}
imgfoto.Picture.Graphic.SaveToStream(Stream);
finally {<---}
Stream.Free;
end; {<---}
end;
end;

procedure TfrmPacientes.mostrar_imagen;
var
Stream: TStream;
begin
Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmRead);
try {<---}
try {<---}
Stream.Seek(0, soFromBeginning);
imgfoto.Picture.Graphic.LoadFromStream(Stream);
except {<---}
// Si falla limpio la foto para que no quede la anterior
imgfoto.Picture := nil;
end; {<---}
finally {<---}
Stream.Free;
end; {<---}
end;

steelha
23-11-2022, 17:55:14
Muchas gracias duilioisola, copie el codigo que me mandaste y aun asi me daba el mismo error. Cambie el Graphic por bitmap y funciono. dejo código por si lo necesitan.
procedure TfrmPacientes.cargar_imagen;
Var
bmp: TBitmap; Stream: TStream;
bs : TMemoryStream;
begin
with DM.QryPacientes do
begin
Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmWrite);
try
imgfoto.Picture.Bitmap.SaveToStream(Stream);
finally
Stream.Free;
end;
end;
end;

procedure TfrmPacientes.mostrar_imagen;
var
Stream: TStream;
begin
Stream := dm.QryPacientes.CreateBlobStream(dm.QryPacientes.FieldByName('pxfoto'), bmRead);
try
try
Stream.Seek(0, soFromBeginning);
imgfoto.Picture.Bitmap.LoadFromStream(Stream);
except
// Si falla limpio la foto para que no quede la anterior
imgfoto.Picture := nil;
end;
finally
Stream.Free;
end;
end;