Gravar imagem em campo blob usando stored procedure firebird

Firebird

30/08/2005

Pessoal, utilizo o Firebird 1.5.2 e uso STORED PROCEDURE para inserir, atualizar e excluir dados no banco.

Estou querendo gravar uma imagem jpg num campo BLOB usando STORED PROCEDURE mas não to conseguindo.

Segue abaixo o codigo de exemplo:
private
    { Private declarations }
    Procedure manutencao( Acao:integer );

  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation

{$R *.dfm}
Procedure TForm1.manutencao(Acao:integer);
begin
   IBTransaction1.Active := true;
   try
   IBStoredProc1.ParamByName(´PACAO´).AsInteger := Acao;
   IBStoredProc1.ParamByName(´PTEXTO´).asstring := DBEdit1.Text;
  TBlobField(IBStoredProc1.ParamByName(´PFIGURA´)).LoadFromFile(OpenPictureDialog1.FileName);

   IBStoredProc1.ExecProc;
   IBTransaction1.Commit;

   except on e:exception do
      begin
         IBTransaction1.Rollback;

         ShowMessage( e.Message );
      end;
   end;
end;

procedure TForm1.CarregafiguraClick(Sender: TObject);
begin
   OpenPictureDialog1.Execute;
   DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

procedure TForm1.SalvarClick(Sender: TObject);
begin
  manutencao(1);
end;


Estou usando o DBIMAGE ... como passo a figura que ta nele para o procedure??? devo usar alguma variavel pra isso???

Att

Armando

[color=green:f41acfecb6]Movido de Delphi para Interbase/Firebird[/color:f41acfecb6]


Armando.boza

Armando.boza

Curtidas 0

Respostas

Gigatel

Gigatel

30/08/2005

Acho q vc vai ter que usar um image normal..pois este DBImage só aceita imagens em BMP...


veja estes códigos e adapte ao seu sistema..



Procedure T_FormCliente.GravaFoto( NomeCampo, FileName: String );
Var
  stImagem: TFileStream;
Begin
  stImagem := TFileStream.Create( FileName, fmOpenRead Or fmShareDenyWrite );
  Try
    TBlobField( DS_CLIENTES.DataSet.FieldByName( NomeCampo ) ).LoadFromStream( stImagem );
  Finally
    stImagem.Free;
  End;




e depois


Procedure T_FormCliente.ObtemFoto( NomeCampo: String; Var imgDestino: TImage );
Var
  jpgImg: TJPEGImage;
  stMem: TMemoryStream;
begin
  If TBlobField( DS_CLIENTES.DataSet.FieldByName( NomeCampo ) ).IsNull or (TBlobField(DS_CLIENTES.DataSet.FieldByName( NomeCampo)).BlobSize = 0) Then
  Begin
    imgDestino.Picture := Nil;
    Exit;
  End;
  jpgImg := TJPEGImage.Create;
  stMem := TMemoryStream.Create;
  try
    TBlobField( DS_CLIENTES.DataSet.FieldByName( NomeCampo ) ).SaveToStream( stMem );
    stMem.Position := 0;
    jpgImg.LoadFromStream( stMem );
    imgDestino.Picture.Assign( jpgImg );
  finally
    stMem.Free;
    jpgImg.Free;
  end;
end;




Para capturar a foto...





   If Not OpenPictureDialog1.Execute Then
    Exit;
    Image3.Picture.LoadFromFile( OpenPictureDialog1.FileName );
      If DS_CLIENTES.DataSet.State = dsBrowse Then
      DS_CLIENTES.DataSet.Edit;
      GravaFoto( ´GS_CLI_FIGURA´, OpenPictureDialog1.FileName );



Para visualizar a foto ..no meu caso coloquei esta função no evento ONDATACHANGE do datasouce


ObtemFoto( ´GS_CLI_FIGURA´,Image3 );






Estude o código esta do jeito q vc prescisa...flw..


GOSTEI 0
Armando.boza

Armando.boza

30/08/2005

amigo, esse exemplo seu é para gravação direta no banco, eu uso stored procedure ... não posso fazer direto como está no seu.


GOSTEI 0
Armando.boza

Armando.boza

30/08/2005

acho que só o nosso amigo [b:5c090d11a8]AFARIAS[/b:5c090d11a8] pra resolver essa mesmo.


GOSTEI 0
Afarias

Afarias

30/08/2005

O TParam não precisa do CAST como o TField, tente fazer assim:


IBStoredProc1.ParamByName(´PFIGURA´).LoadFromFile(OpenPictureDialog1.FileName, ftBlob);



T+


GOSTEI 0
Armando.boza

Armando.boza

30/08/2005

O TParam não precisa do CAST como o TField, tente fazer assim: IBStoredProc1.ParamByName(´PFIGURA´).LoadFromFile(OpenPictureDialog1.FileName, ftBlob); T+


Perfeito mais uma vez.... muito obrigado [b:f7fb14f963]afarias[/b:f7fb14f963].

Achon que ja é a décima vez que vc me socorre ... kkkkkkkkkkkkk

Valew


GOSTEI 0
Armando.boza

Armando.boza

30/08/2005

o detalhe agora é o seguinte.

estou usando o DBIMAGE, estou conseguindo gravar JPG, BMP etc .. tudo normal.

mas quando vou editar o registro, os que possuem BMP blz .. a imagem aparece do DBIMAGE legal, mas os que são JPG dá erro ao trazer a imagem pro DBIMAGEM.

[b:8b9ce1098f]mas como dá erro ao trazer a imagem do banco se quando vou gravar ele aceita normal o JPG??????[/b:8b9ce1098f]


GOSTEI 0
Afarias

Afarias

30/08/2005

|mas como dá erro ao trazer a imagem do banco se quando vou gravar
|ele aceita normal o JPG??????

quando vc grava está acessando a imagem direto do arquivo, o banco não quer saber o q é! Vc pode gravar o q quiser no BLOB.

Mas o componente padrão do Delphi TDBImage é feito apenas para suportar arquivos BMP, sendo assim vc não pode usá-lo para mostrar outra coisa.

Se deseja mostrar JPG entre outros formatos, utilize um componente tipo o DBImage de terceiros q suporte outros formatos ou faça o carregamento do arquivo manualmente usando um TImage comum.


T+


GOSTEI 0
Sandra

Sandra

30/08/2005

|Se deseja mostrar JPG entre outros formatos, utilize um componente tipo o DBImage de terceiros q suporte outros formatos ou faça o carregamento do arquivo manualmente usando um TImage comum.
Armando,

Uma dica de componente fornecida pela Lucania (aqui mesno no fórum) é o [url=http://cc.borland.com/Item.aspx?id=22742]EDBImage 1.6 JPG in your DB[/url] no tópico [url=http://forum.clubedelphi.net/viewtopic.php?t=61529&highlight=edbimage]Gravar imagem JPG[/url].
Obs.: Está disponível para as versões 4, 5, 6 ou 7. Faça o download e instale de acordo com a sua versão do Delphi.


Boa sorte!


GOSTEI 0
Armando.boza

Armando.boza

30/08/2005

|mas como dá erro ao trazer a imagem do banco se quando vou gravar |ele aceita normal o JPG?????? quando vc grava está acessando a imagem direto do arquivo, o banco não quer saber o q é! Vc pode gravar o q quiser no BLOB. Mas o componente padrão do Delphi TDBImage é feito apenas para suportar arquivos BMP, sendo assim vc não pode usá-lo para mostrar outra coisa. Se deseja mostrar JPG entre outros formatos, utilize um componente tipo o DBImage de terceiros q suporte outros formatos ou faça o carregamento do arquivo manualmente usando um TImage comum. T+


valew ... fiz um esquema com Stream e ta funcionando .... mas vou realizar mais alguns testes pra ver.


GOSTEI 0
Armando.boza

Armando.boza

30/08/2005

[quote:49b96761bb=´afarias´]|Se deseja mostrar JPG entre outros formatos, utilize um componente tipo o DBImage de terceiros q suporte outros formatos ou faça o carregamento do arquivo manualmente usando um TImage comum.
Armando,

Uma dica de componente fornecida pela Lucania (aqui mesno no fórum) é o [url=http://cc.borland.com/Item.aspx?id=22742]EDBImage 1.6 JPG in your DB[/url] no tópico [url=http://forum.clubedelphi.net/viewtopic.php?t=61529&highlight=edbimage]Gravar imagem JPG[/url].
Obs.: Está disponível para as versões 4, 5, 6 ou 7. Faça o download e instale de acordo com a sua versão do Delphi.


Boa sorte![/quote:49b96761bb]

Muito obrigado .. ja to baixando e testando...


GOSTEI 0
Armando.boza

Armando.boza

30/08/2005

Pessoal ... nos meus testes fiz assim e funcionou legal .. to usando o dbimage mesmo mas pode ser o timage que funciona tb...

Valew pessoal, muito obrigado mesmo.

private
    { Private declarations }
    Procedure manutencao( Acao:integer );

  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  stm : TStream;

implementation

{$R *.dfm}

Procedure TForm1.manutencao(Acao:integer);
begin
   IBTransaction1.Active := true;
   try
      IBStoredProc1.ParamByName(´PACAO´).AsInteger := Acao;
      IBStoredProc1.ParamByName(´PTEXTO´).asstring := DBEdit1.Text;
      IBStoredProc1.ParamByName(´PFIGURA´).LoadFromStream(stm,ftblob);
      //pode ser assim tb mas dai vc tem que usar somente bmp com dbimage.
      //IBStoredProc1.ParamByName(´PFIGURA´).LoadFromFile(OpenPictureDialog1.FileName,ftBlob);

      IBStoredProc1.ExecProc;
      IBTransaction1.Commit;
      stm.Free;
   except on e:exception do
      begin
         IBTransaction1.Rollback;
         ShowMessage( e.Message );
      end;
   end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   if OpenPictureDialog1.Execute then begin
      DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
   end;
   stm := nil;
   stm := TMemoryStream.Create;
   DBImage1.Picture.Graphic.SaveToStream(stm);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  if IBQuery1.State = dsinsert then begin
     manutencao(1);
  end;
  if IBQuery1.State = dsedit then begin
     manutencao(2);
  end;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
      IBQuery1.close;
      IBQuery1.sql.Clear;
      IBQuery1.params.clear;
      IBQuery1.sql.add(´SELECT * FROM TESTE WHERE TEXTO IS NULL´);
      IBQuery1.open;
      IBQuery1.Insert;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
var
   jpg : TJPEGImage;
begin
   jpg := nil;
   IBQuery1.close;
   IBQuery1.sql.Clear;
   IBQuery1.params.clear;
   IBQuery1.sql.add(´SELECT * FROM TESTE WHERE TEXTO = ´´maria´´´); //maria é a pessoa que tem foto JPG
   IBQuery1.open;

   stm := IBQuery1.CreateBlobStream(IBQuery1.FieldByName(´FIGURA´),bmRead);

   jpg := TJPEGImage.Create;
   jpg.LoadFromStream(stm);
   dbImage1.Picture.Assign(jpg);

   IBQuery1.Edit;

end;

end.



GOSTEI 0
POSTAR