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)
-   -   No Logro grabar una imagen desde Clipboard hacia la BD (https://www.clubdelphi.com/foros/showthread.php?t=90117)

darkamerico 09-04-2016 04:55:56

No Logro grabar una imagen desde Clipboard hacia la BD
 
Saludos amigos, estoy intentando grabar una imagen que tengo en un componente cxImage hacia la BD, la imagen la obtengo desde la camara web, luego la pongo en Clipboard en BMP:

Este codigo funciona bien:

Código Delphi [-]
procedure TForm9.BitBtn1Click(Sender: TObject);
var
  MyFormat : Word;
  AData : THandle;
  APalette : HPALETTE;
begin
  img.Picture.SaveToClipboardFormat(MyFormat, AData, APalette);
  ClipBoard.SetAsHandle(MyFormat,AData);
  form3.imgEnClipBoard:=true;
  form9.Hide;
end;

Luego en el otro formulario en OnActivate intento que la imagen se muestre y luego se grabe en su tabla correspondiente:

Código Delphi [-]
procedure TForm3.FormActivate(Sender: TObject);
var
  nomArch:string;
  BlobFieldValue:TMemoryStream;
begin
  if imgEnClipBoard=false then
   tab.PageIndex:=0
  else
  begin
    BlobFieldValue:=TMemoryStream.Create;
    imgFoto2.Picture.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap), 0);
    imgFoto2.Picture.Bitmap.SaveToStream(BlobFieldValue);

      dm.q_UPDFoto.Close;
      dm.q_UPDFoto.Params[0].LoadFromStream(BlobFieldValue,ftblob);
      dm.q_UPDFoto.ParamByName('IDPerx').AsInteger:=StrToInt(txtID.Text);
      dm.q_UPDFoto.ExecSQL;

  end;

El error aparece en la linea: dm.q_UPDFoto.ExecSQL;

El error que aparece es el siguiente:



El SQL del componente q_UPDFoto es el siguiente:

Código SQL [-]
UPDATE personal set foto=:FOTOX
where id_personal=:IDPerx

Agradezco cualquier alcance que me puedan brindar.

Casimiro Noteví 09-04-2016 09:51:41

No repitas temas.
He borrado el otro.

darkamerico 10-04-2016 14:51:07

Saludos
 
Alguna idea?, en realidad no logro descifrar el error.

AgustinOrtu 10-04-2016 21:20:27

Si queres guardar una imagen de manera "normal" es decir sacando todo lo del portapapeles, funciona?
Cual es el tipo del campo en la BD?

darkamerico 11-04-2016 04:49:51

Saludos
 
El tipo del campo es Longblob amigo.

ecfisa 11-04-2016 07:29:10

Hola darkamerico.

No mencionaste con que componentes estas trabajando y hay diferencias al operar entre ellos.

Pero para darte un ejemplo orientativo, de este modo copiarias un TBitmap desde el clipboard a un TBlobField usando los componentes IBX:
Código Delphi [-]
...
var
  Stream: TStream;
  bmp   : TBitmap;
begin
  if Clipboard.HasFormat(CF_BITMAP) then
  begin
    Stream := TMemoryStream.Create;
    try
      bmp := TBitmap.Create;
      try
        bmp.Assign(Clipboard);
        bmp.SaveToStream(Stream);
      finally
        bmp.Free;
      end;
      Stream.Seek(0, soBeginning);
      IBQuery1.SQL.Clear;
      IBQuery1.SQL.Text := 'UPDATE LA_TABLA SET CPO_IMAGE = :IMAGE WHERE ID = :ID';
      IBQuery1.ParamByName('ID').AsInteger := un_ID;
      IBQuery1.ParamByName('IMAGE').LoadFromStream(Stream, ftBlob);
      IBQuery1.ExecSQL;
    finally
      Stream.Free;
    end;
  end;
end;

Saludos :)

darkamerico 12-04-2016 00:01:44

Muchas Gracias
 
GRACIAS ECFISA!!!

Es una real satisfacción comunicarles que al fin salio el código, aquí lo comparto con ustedes:

Código Delphi [-]
procedure TForm3.Inserta(Sender: TObject);
var
  nomArch: string;
  BlobFieldValue: TMemoryStream;
  bmp, BMPdestino:TBitmap;
  Rect: TRect;
begin
  if imgEnClipBoard = false then
    tab.PageIndex := 0
  else
  begin
    if Clipboard.HasFormat(CF_BITMAP) then
    begin
      BlobFieldValue := TMemoryStream.Create;
      try
        bmp:=TBitmap.Create;
        BMPdestino:=TBitmap.Create;
        try
          bmp.Assign(Clipboard);
          BMPdestino.Width := 100;
          BMPdestino.Height := 100;
          Rect:= TRect.Create(0, 0, 100, 100);
          BMPdestino.Canvas.StretchDraw(Rect, bmp);
          BMPdestino.SaveToStream(BlobFieldValue);
        finally
          bmp.Free;
          BMPdestino.Free;
        end;
        BlobFieldValue.Seek(0, soBeginning);
        dm.q_UPDFoto.Close;
        dm.q_UPDFoto.Params[0].LoadFromStream(BlobFieldValue, ftblob);
        dm.q_UPDFoto.ParamByName('IDPerx').AsInteger := StrToInt(txtID.Text);
        dm.q_UPDFoto.ExecSQL;
      finally
        BlobFieldValue.Free;
      end;
    end;
  end;
end;


La franja horaria es GMT +2. Ahora son las 00:12:03.

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