Erro ao gravar foto no banco
colegas eu não estou conseguindo gravar fotos no banco FireBird, sei que na web tem vários exemplo, mas não consegui chegar a uma conclusão correta. Alguem poderia me ajudar com este problema?
erro quando eu vou grava no banco: [color=red:6bc9555caf]Access violation at address 00000000, Read of address 00000000.[/color:6bc9555caf]
fiz um pequeno exemplo, se alguem tem alguma forma melhor de como gravar no banco eu agradeço!
vlw.
erro quando eu vou grava no banco: [color=red:6bc9555caf]Access violation at address 00000000, Read of address 00000000.[/color:6bc9555caf]
fiz um pequeno exemplo, se alguem tem alguma forma melhor de como gravar no banco eu agradeço!
procedure TForm1.btnGravarClick(Sender: TObject); begin // o erro está nesta linha abaixo. IBStoredProc1.ParamByName(´foto´).LoadFromStream(GravaFoto(pctImagem.FileName), ftBlob); IBStoredProc1.ExecProc; IBTransaction1.Commit; end; function TForm1.GravaFoto(FileName : string) : TMemoryStream; var Jpg : TJpegImage; Bitmap : TBitmap; MemoryStream : TMemoryStream; begin Jpg := TJpegImage.Create; MemoryStream := TMemoryStream.Create; Bitmap := TBitmap.Create; try if (AnsiUpperCase(ExtractFileExt(FileName)) = ´.BMP´) then begin Bitmap.LoadFromFile(FileName); Jpg.Assign(Bitmap); Jpg.Compress; end else Jpg.LoadFromFile(FileName); Jpg.SaveToStream(MemoryStream); Result := MemoryStream; finally MemoryStream.Free; Bitmap.Free; Jpg.Free; end; end;
vlw.
Pestana_
Curtidas 0
Respostas
Edilcimar
02/02/2008
Se a foto estiver em uma picture a maneira mais prática e simples é esta:
If Image1.Picture <> Nil then
FieldByName(´FOTO´).Assign(Image1.Picture.Graphic);
isto pode ser feito usando uma table, ibtable, query, etc
If Image1.Picture <> Nil then
FieldByName(´FOTO´).Assign(Image1.Picture.Graphic);
isto pode ser feito usando uma table, ibtable, query, etc
GOSTEI 0
Pestana_
02/02/2008
Se a foto estiver em uma picture a maneira mais prática e simples é esta:
If Image1.Picture <> Nil then
FieldByName(´FOTO´).Assign(Image1.Picture.Graphic);
isto pode ser feito usando uma table, ibtable, query, etc
Ola Edilcimar, obrigado por me ajudar, eu fiz desta maneira e aparece o seguinte erro: [color=rede:9c2d458712]Unsupported feature[/color:9c2d458712]
procedure TForm1.btnGravarClick(Sender: TObject); begin if imgFoto.Picture <> nil then IBStoredProc1.ParamByName(´foto´).Assign(imgFoto.Picture.Graphic); IBStoredProc1.ExecProc; IBTransaction1.Commit; end;
agradeço pela atenção,
Pestana.
GOSTEI 0
Edilcimar
02/02/2008
Se a tua foto for um jpeg então tem que criar um jpeg antes de tentar gravar, caso contrário dará o erro
GOSTEI 0
Pestana_
02/02/2008
Edilcimar eu já faço isso na função GravarFoto e tambem se a foto for do tipo .bmp ele converte para .jpeg, não sei se a forma correta!
já tentei de várias formas, mas até agora não sei aonde estou errando.
Obrigado por estar me ajudando,
Pestana.
já tentei de várias formas, mas até agora não sei aonde estou errando.
Obrigado por estar me ajudando,
Pestana.
GOSTEI 0
Paullsoftware
02/02/2008
só por curiosidade não seria melhor gravar o path(caminho) da imagem no seu banco??? assim o espaço ficaria bem menor não acha? :roll:
GOSTEI 0
Pestana_
02/02/2008
só por curiosidade não seria melhor gravar o path(caminho) da imagem no seu banco??? assim o espaço ficaria bem menor não acha? :roll:
pode até ser, mas se eu armazenar o path no banco eu precisaria utilizar o compartilhamento da rede e eu não queria fazer isso.
vlw.
GOSTEI 0
Catunda
02/02/2008
Colega Pestana_, essa semana tb passei por esse tipo de problema e fiz uma adaptação de um metodo que achei na net.
Para entender melhor eu utilizo um formfuncionarios no qual existe um DBImage para a foto. Clicando no DBImage abre-se um outro form (form1) onde localizo e seleciono a foto desejada, então é só clicar no BitBtn1 para jogar a foto no campo apropriado (foto) e no DBImage do formfuncionarios. Então o form1 é fechado e volto ao formfuncionarios onde já está apresentada a foto selecionada, mas que ainda não foi salva fisicamente pq isso só será feito se for clicar no botão adequado pra confirmar as alterações (no caso com o applyupdates).
procedure TForm1.BitBtn1Click(Sender: TObject);
var
vextensao: String;
Picture: TPicture;
aBmp: TBitmap;
begin
vextensao:=ExtractFileExt(FileListBox1.FileName);
Picture := graphics.TPicture.Create;
aBmp := TBitmap.Create;
Picture.LoadFromFile(FileListBox1.filename);
vextensao := ExtractFileExt(FileListBox1.Filename);
aBmp.Assign(Picture.Graphic);
FormFuncionarios.Cds1.ReadOnly:=false;
FormFuncionarios.DBImage1.picture.assign(aBmp);
FormFuncionarios.Cds1.Edit;
formfuncionarios.Cds1FOTO.Assign(aBmp);
Picture.Free;
aBmp.Free;
close;
end;
Para entender melhor eu utilizo um formfuncionarios no qual existe um DBImage para a foto. Clicando no DBImage abre-se um outro form (form1) onde localizo e seleciono a foto desejada, então é só clicar no BitBtn1 para jogar a foto no campo apropriado (foto) e no DBImage do formfuncionarios. Então o form1 é fechado e volto ao formfuncionarios onde já está apresentada a foto selecionada, mas que ainda não foi salva fisicamente pq isso só será feito se for clicar no botão adequado pra confirmar as alterações (no caso com o applyupdates).
procedure TForm1.BitBtn1Click(Sender: TObject);
var
vextensao: String;
Picture: TPicture;
aBmp: TBitmap;
begin
vextensao:=ExtractFileExt(FileListBox1.FileName);
Picture := graphics.TPicture.Create;
aBmp := TBitmap.Create;
Picture.LoadFromFile(FileListBox1.filename);
vextensao := ExtractFileExt(FileListBox1.Filename);
aBmp.Assign(Picture.Graphic);
FormFuncionarios.Cds1.ReadOnly:=false;
FormFuncionarios.DBImage1.picture.assign(aBmp);
FormFuncionarios.Cds1.Edit;
formfuncionarios.Cds1FOTO.Assign(aBmp);
Picture.Free;
aBmp.Free;
close;
end;
GOSTEI 0
Edilcimar
02/02/2008
isto aqui está em um programa meu, onde a pessoa clica em um filelistbox, com mascara jpg e jpeg para selecionar a foto do cliente para posterior gravação
Image1.Picture.LoadFromFile(FileListBox1.FileName);
depois disto, para gravar a imagem em um banco firebird uso
If Image1.Picture <> Nil then
FieldByName(´FOTO´).Assign(Image1.Picture.Graphic);
Isto está funcionando perfeitamente
Image1.Picture.LoadFromFile(FileListBox1.FileName);
depois disto, para gravar a imagem em um banco firebird uso
If Image1.Picture <> Nil then
FieldByName(´FOTO´).Assign(Image1.Picture.Graphic);
Isto está funcionando perfeitamente
GOSTEI 0
Aroldo Zanela
02/02/2008
Colega,
A forma de menor esforço é usando o método LoadFromFile dos objetos TFields. Você pode armazenar qualquer ´coisa´ num campo blob (PDF, EXE, BMP, JPG, etc.) Para visualizar, procure pelo EDBImage aqui no fórum.
A forma de menor esforço é usando o método LoadFromFile dos objetos TFields. Você pode armazenar qualquer ´coisa´ num campo blob (PDF, EXE, BMP, JPG, etc.) Para visualizar, procure pelo EDBImage aqui no fórum.
GOSTEI 0