GARANTIR DESCONTO

Fórum Erro ao gravar foto no banco #352925

02/02/2008

0

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!

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_

Pestana_

Responder

Posts

02/02/2008

Edilcimar

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


Responder

Gostei + 0

03/02/2008

Pestana_

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.


Responder

Gostei + 0

04/02/2008

Edilcimar

Se a tua foto for um jpeg então tem que criar um jpeg antes de tentar gravar, caso contrário dará o erro


Responder

Gostei + 0

04/02/2008

Pestana_

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.


Responder

Gostei + 0

04/02/2008

Paullsoftware

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:


Responder

Gostei + 0

04/02/2008

Pestana_

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.


Responder

Gostei + 0

05/02/2008

Catunda

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;


Responder

Gostei + 0

05/02/2008

Edilcimar

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


Responder

Gostei + 0

05/02/2008

Aroldo Zanela

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar