Gravar imagem em campo blob usando stored procedure firebird
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:
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]
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
Curtidas 0
Respostas
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..
e depois
Para capturar a foto...
Para visualizar a foto ..no meu caso coloquei esta função no evento ONDATACHANGE do datasouce
Estude o código esta do jeito q vc prescisa...flw..
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
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
30/08/2005
acho que só o nosso amigo [b:5c090d11a8]AFARIAS[/b:5c090d11a8] pra resolver essa mesmo.
GOSTEI 0
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+
IBStoredProc1.ParamByName(´PFIGURA´).LoadFromFile(OpenPictureDialog1.FileName, ftBlob);
T+
GOSTEI 0
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
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]
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
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+
|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
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
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
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
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.
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