Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   SQL (http://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Guardar Imagen en SQL (http://www.clubdelphi.com/foros/showthread.php?t=92855)

BlueSteel 22-02-2018 15:44:07

Guardar Imagen en SQL
 
Holas

Ando medio lento y necesito vuestra ayudita...

Quiero almacenar una imagen en un base de datos de SQL. Campo de tipo Image

Quiero traspasar la imagen que esta en un componente TImagen (sFot)
Cargue la foto en el TImagen con componente TOpenPictureDialog

Aqui el proceso para guardar el registro, en donde tambien quiero guardar la foto

DM_Datos : Formulario tipo DataModule
AQ_Insert : AdoQuery

Código Delphi [-]
     DM_Datos.AQ_Insert.Close;
     DM_Datos.AQ_Insert.SQL.Clear;
     DM_Datos.AQ_Insert.SQL.Add('Insert Into Socio(Soc_Rut,Soc_Nombre,Soc_APaterno,Soc_AMaterno,Soc_FecNac,Soc_Estado,Soc_Direccion,Soc_Poblacion  ,Soc_Comuna,Soc_Telefono,Soc_Celular,Soc_Email,Id_TipoSocio,Id_Categoria,Soc_FechaIngreso,Soc_Foto)'  );
     DM_Datos.AQ_Insert.SQL.Add('Values (:v01, :v02, :v03, :v04, :v05, :v06, :v07, :v08, :v09, :v10, :v11, :v12, :v13, :v14, :v15, :v16)');
     DM_Datos.AQ_Insert.Parameters[0].Value   := sRut.Text;
     DM_Datos.AQ_Insert.Parameters[1].Value   := sNom.Text;
     DM_Datos.AQ_Insert.Parameters[2].Value   := sPat.Text;
     DM_Datos.AQ_Insert.Parameters[3].Value   := sMat.Text;
     DM_Datos.AQ_Insert.Parameters[4].Value   := sNac.Date;
     DM_Datos.AQ_Insert.Parameters[5].Value   := 1;
     DM_Datos.AQ_Insert.Parameters[6].Value   := sDir.Text;
     DM_Datos.AQ_Insert.Parameters[7].Value   := sPob.Text;
     DM_Datos.AQ_Insert.Parameters[8].Value   := sCom.Text;
     DM_Datos.AQ_Insert.Parameters[9].Value   := sTel.Text;
     DM_Datos.AQ_Insert.Parameters[10].Value  := sCel.Text;
     DM_Datos.AQ_Insert.Parameters[11].Value  := sMai.Text;
     DM_Datos.AQ_Insert.Parameters[12].Value  := DM_Datos.AQ_Tipo.FieldByName('Id_TipSocio').Value;
     DM_Datos.AQ_Insert.Parameters[13].Value  := DM_Datos.AQ_Categoria.FieldByName('Id_Categoria').Value;
     DM_Datos.AQ_Insert.Parameters[14].Value  := sIng.date;
    // Hasta aqui, todo funciona bien,me almacena, solo agregue ahora guardar la foto


     // La siguiente linea es donde quiero traspasar la Foto a la Tabla
     DM_Datos.AQ_Insert.Parameters[15].Value  :=  sFot.Picture. // en realidad no se como definir.. 

     DM_Datos.AQ_Insert.ExecSQL;

revise los foros y encontre lo siguiente, pero no lo entendi
Código Delphi [-]
procedure GuardarImagen(Imagen: TImage);
var
  StreamImagen: TStream;
begin
  qry := crear tu componente query 
  qry.Connection := le asignas la conexion
  qry.SQL.Text := 'INSERT INTO TABLA (CampoImagen) VALUES (:CampoImagen)';
  StreamImagen := TMemoryStream.Create;
  try
     Imagen.SaveToStream(StreamImagen);
    StreamImagen.Position := 0;
    qry.ParamByName('CampoImagen').AsSteam := StreamImagen;
    // puede ser en lugar de .AsSteam, .Value, o .LoadFromStream; depende de los componentes
    qry.Execute;
  finally
   StreamImagen.Free;
  end;
end

oscorm 22-02-2018 16:01:30

Prueba:
DM_Datos.AQ_Insert.Parameters[15].LoadFromFile('c:\sample.jpg', ftBlob);
donde 'c:\sample.jpg' es el fichero que tiene la foto

BlueSteel 22-02-2018 18:57:55

Cita:

Empezado por oscorm (Mensaje 524721)
Prueba:
DM_Datos.AQ_Insert.Parameters[15].LoadFromFile('c:\sample.jpg', ftBlob);
donde 'c:\sample.jpg' es el fichero que tiene la foto

Interprete el codigo que me indicas con esto

Código Delphi [-]
     DM_Datos.AQ_Insert.Parameters[15].LoadFromFile(BuscaFoto.filename, ftBlob);

donde BuscaFoto es un componente de tipo OpenPictureDialogo. Lo que tomo de ella es la ruta donde esta ubicada la foto

Ahora el error que me indica es

[dcc32 Error] frmCreaActSocios.pas(143): E2003 Undeclared identifier: 'ftBlob'

oscorm 22-02-2018 19:23:26

Este te deberia funcionar

TBlobField(DM_Datos.AQ_Insert.Parameters[15]).LoadFromFile(BuscaFoto.filename);

BlueSteel 22-02-2018 21:25:33

Cita:

Empezado por oscorm (Mensaje 524727)
Este te deberia funcionar

TBlobField(DM_Datos.AQ_Insert.Parameters[15]).LoadFromFile(BuscaFoto.filename);


me sigue dando error :(:confused:

Código Delphi [-]
     TBlobField(DM_Datos.AQ_Insert.Parameters[15]).LoadFromFile(BuscaFoto.filename);

Error
[dcc32 Error] frmCreaActSocios.pas(143): E2003 Undeclared identifier: 'TBlobField'
[dcc32 Error] frmCreaActSocios.pas(143): E2066 Missing operator or semicolon

oscorm 22-02-2018 21:35:51

TBlobField está definido en la unidad DB o Data.DB dependiendo de la versión de Delphi con la que estés trabajando.
Pon que use esa unit en la parte del uses de interface y debería tirar

BlueSteel 23-02-2018 12:52:41

Cita:

Empezado por oscorm (Mensaje 524733)
TBlobField está definido en la unidad DB o Data.DB dependiendo de la versión de Delphi con la que estés trabajando.
Pon que use esa unit en la parte del uses de interface y debería tirar

Excelente, ya me funciono


Código Delphi [-]
// Esta linea no funciono. Si bien compila, al momento de guardar genera error
TBlobField(DM_Datos.AQ_Insert.Parameters[15]).LoadFromFile(BuscaFoto.filename);

// Esta linea funciono super...
DM_Datos.AQ_Insert.Parameters[15].LoadFromFile(BuscaFoto.filename, ftBlob);

Gracias :D

BlueSteel 23-02-2018 19:30:23

Me faltaría realizar ahora el proceso inverso, es decir, saber como traspaso la foto que esta en la base de datos a un componente de tipo TImage?

jafera 26-02-2018 12:41:00

Yo lo hago así:

Código Delphi [-]
procedure TF_Material.DBEdit1Change(Sender: TObject);
var
        jpg:TJpegImage;
        foto:TMemoryStream;
begin
        PageControl1.ActivePage := TabSheet1;

        If SysUtils.FileExists('C:\Trens_1.0\Temp\Temporal.jpg') then
        SysUtils.DeleteFile ('C:\Trens_1.0\Temp\Temporal.jpg');

        If F_Moduldades.MaterialFoto.AsString <>'' then
        begin
                Jpg:=TJpegImage.create;
                Foto:=TMemoryStream.create;
                try
                        F_Moduldades.MaterialFoto.SaveToStream(Foto);
                        Foto.Seek(0,soFromBeginning);
                        Jpg.LoadFromStream(Foto);
                        Jpg.SaveToFile('C:\Trens_1.0\Temp\Temporal.jpg');
                        Image1.Picture.Assign(Jpg);
                finally
                        Foto.Free;
                        Jpg.Free;
                end;
        end
        else
                Image1.Picture.Assign(nil);
end;

Saludos

BlueSteel 26-02-2018 13:46:44

Cita:

Empezado por jafera (Mensaje 524757)
Yo lo hago así:

Código Delphi [-]
procedure TF_Material.DBEdit1Change(Sender: TObject);
var
        jpg:TJpegImage;
        foto:TMemoryStream;
begin
        PageControl1.ActivePage := TabSheet1;

        If SysUtils.FileExists('C:\Trens_1.0\Temp\Temporal.jpg') then
        SysUtils.DeleteFile ('C:\Trens_1.0\Temp\Temporal.jpg');

        If F_Moduldades.MaterialFoto.AsString <>'' then
        begin
                Jpg:=TJpegImage.create;
                Foto:=TMemoryStream.create;
                try
                        F_Moduldades.MaterialFoto.SaveToStream(Foto);
                        Foto.Seek(0,soFromBeginning);
                        Jpg.LoadFromStream(Foto);
                        Jpg.SaveToFile('C:\Trens_1.0\Temp\Temporal.jpg');
                        Image1.Picture.Assign(Jpg);
                finally
                        Foto.Free;
                        Jpg.Free;
                end;
        end
        else
                Image1.Picture.Assign(nil);
end;

Saludos

Hola, disculpa,,, con el codigo que indicastes, pasas una foto que esta almacenada en una Tabla del SQL Server al componente TImage???

jafera 26-02-2018 15:41:14

Si, pero yo utilizo Firebird no se si el SQL que utilizas tu usa los mismos parametros, pero puedes ajustarlo.
Este proceso esta puesto en un DBEdit que al cambiar borra la foto en temporal y recarga la nueva

Saludos

mRoman 27-02-2018 05:07:07

Otra forma
 
Hola buenas noches BlueSteel

Yo lo hago de esta forma (Lo q esta marcado con rojo, es lo q talvez necesites).

Código Delphi [-]
procedure TfrmProducto.btnGrabarClick(Sender: TObject);
var
   bmp:TBitmap; Stream:TStream;

begin
  inherited;
  try
        if chkBActivar.Checked then
            dsProducto.FieldByName('ACTIVAR_PRODUCTO').AsInteger:=1
        else
            dsProducto.FieldByName('ACTIVAR_PRODUCTO').AsInteger:=0;
        if chkKardex.Checked then
            dsProducto.FieldByName('CONTROL_KARDEX').AsString:='S'
        else
            dsProducto.FieldByName('CONTROL_KARDEX').AsString:='N';
        {Este clave servira para identificar si el producto es subsidiado o comercial,
        utilizando el numero 0 para los productos que son comerciales y el 1 para
        los productos subsidiados.}
        bmp:=TBitmap.Create;
        bmp.Assign(Image1.Picture.Graphic);
        dsProducto.FieldByName('TIPO_PRODUCTO').AsInteger:=cbxTipoProducto.ItemIndex;
        dsProducto.FieldByName('TIPO_LECHE').AsInteger:=cbxTipoLeche.ItemIndex;
        dsProducto.FieldByName('FOTO').Assign(bmp)  //Aqui le asigno la foto al campo de la tabla
        dsProducto.FieldByName('envase').AsString:=cbxEnvase.Text;
        dsProducto.FieldByName('embalaje').AsString:=cbxEmbalaje.Text;
        dsProducto.Post;
        dsProducto.ApplyUpdates;
        modDatos.trsFluida.Commit;
        btnGrabar.Enabled:=False;
        btnEliminar.Enabled:=False;
        btnCancelar.Enabled:=False;
        edClave.Text:='';
        edClave.SetFocus;
  except
        modDatos.trsFluida.Rollback;
        showmessage('Este registro no se puede Grabar');
  end;
end;

Y aqui...la leo de la tabla para q se muestre en un componente TImage
Código Delphi [-]
procedure TfrmProducto.pnlClavesExit(Sender: TObject);
var
i:integer;
begin
  inherited;
  dsProducto.Close;
  dsProducto.ParamByName('CVE_PROD').AsString:=edClave.Text;
  dsProducto.Open;
  if dsProducto.IsEmpty then
  begin
        btnGrabar.Enabled:=True;
        btnEliminar.Enabled:=False;
        btnCancelar.Enabled:=True;
        dsProducto.Append;
        dsProducto.FieldByName('CVE_PRODUCTO').AsString:=edClave.Text;
        GroupBox4.Enabled:=True;
  end Else Begin
        btnGrabar.Enabled:=True;
        btnEliminar.Enabled:=True;
        btnCancelar.Enabled:=True;
        dsProducto.Edit;
        if dsProducto.FieldByName('ACTIVAR_PRODUCTO').AsInteger=1 then
            chkBActivar.Checked:=True
        else
            chkBActivar.Checked:=False;
        if dsProducto.FieldByName('CONTROL_KARDEX').AsString='S' then
            chkKardex.Checked:=True
        else
            chkKardex.Checked:=False; 

        if dsProducto.FieldByName('tipo_producto').AsInteger=0 then
             Panel1.Visible:=True
        else
             Panel1.Visible:=False;

        for i:=0 to cbxEnvase.Items.Count -1 do
        begin
             if cbxEnvase.Items[i]=dsProducto.FieldByName('envase').AsString then
             begin
                  cbxEnvase.ItemIndex:=i;
             end;
        end;

        for i:=0 to cbxEmbalaje.Items.Count -1 do
        begin
             if cbxEmbalaje.Items[i]=dsProducto.FieldByName('embalaje').AsString then
             begin
                  cbxEmbalaje.ItemIndex:=i;
             end;
        end;
        if (dsProducto.FieldByName('stock_inicial').IsNull) or
           (dsProducto.FieldByName('stock_inicial').AsInteger=0) then
        begin
             GroupBox4.Enabled:=True;
        end;
        cbxTipoLeche.ItemIndex:=dsProducto.fieldByName('TIPO_LECHE').AsInteger;
        cbxTipoProducto.ItemIndex:=dsProducto.fieldByName('TIPO_PRODUCTO').AsInteger;
        Image1.Picture.Assign(dsProducto.fieldbyname('foto'));
  end;
end;

En la tabla declaras un campo tipo BLOB Binary....bueno eso en Firebird. Espero te sirva el ejemplo.

Saludos.


La franja horaria es GMT +2. Ahora son las 08:51:56.

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