Ir para conteúdo
Fórum Script Brasil
  • 0

gravar foto em postgree


Guest sllc

Pergunta

Olá, Pessoal

Estou precisando de uma rotina que salve o jpg dentro de um banco de dados postgree. Utilizo o delphi 7 e o componente zeoslib para conexão. Li alguns artigos sobre isso mas nenhum deles funcionou.

O exemplo mais simples usava uma função chamada lo_import e lo_export, mas estas funções são desconhecidas no delphi 7 que está instalado na minha máquina.

Também li um post aqui que salva as imagens, tentei adaptar o código mas deu um erro estranho na 3ª linha quando testei - alguma coisa sobre o assign.

jpg1 := TJpegImage.Create;

jpg1.LoadFromFile('C:\SGP\Fotos\'+Trim(mskedtMatricula.Text)+'.jpg');

dtmdlFolha.zqryServidor.FieldByName('ft_servidor').Assign(jpg1);

dtmdlFolha.zqryServidor.Post;

Alguém poderia ajudar? Agradeço muito desde já.

Att.

Sergio

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Ihhhh, relendo o artigo, agora é que vi que as funções lo_import e lo_export são usadas para ler/salvar fotos no banco de dados postgree, porém em linguagem Java e não em Delphi. Por isso, estas funções são desconhecidas do Delphi. Desculpem a minha falha.

Continuo com o problema, se alguém puder ajudar?!?! Obrigado.

Sergio

Link para o comentário
Compartilhar em outros sites

  • 0

sllc, você não disse que posts leu, então, segue de referência estes porque o caminho passa, com mais segurança, pelo uso de TMemoryStream:

http://scriptbrasil.com.br/forum/index.php...st&p=458617

http://scriptbrasil.com.br/forum/index.php...st&p=471083

http://scriptbrasil.com.br/forum/index.php...st&p=427052

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, agradeço sinceramente sua resposta.

Aliás, você sempre ajuda vários colegas deste fórum - parabéns por sempre ajudar. Devemos muito ao seu conhecimento e boa vontade em passar para frente. Continue assim!!!

Bem, implementei o código assim:

if FileExists(Trim(mskedtMatricula.Text)+'.jpg') then

begin

MS := TMemoryStream.Create;

try

imgFoto.Picture.Graphic.SaveToStream(MS);

(dtmdlFolha.zqryServidor.FieldByName('ft_servidor') as TBlobField).LoadFromStream(MS);

finally

MS.Free;

end;

end;

dtmdlFolha.zqryServidor.Post;

e aí deu o erro quando passa pelo post: "Invalid class typecast".

Acho que o problema central é o banco de dados que é Postgree - se fosse Interbase/Firebird já estaria resolvido, mas o Postgree é um bd que nós delphinos não temos muita intimidade. Daí a dificuldade.

Referenciar um TBlobField para um campo tipo Oid no Postgree - acho que é isso o problema. Tentei encontrar outro tipo de campo no help do Delphi, mas o Delphi sempre define o blob para campos de imagem. Fazer o que?

Eu herdei um banco de dados já pronto e tenho que implementar neste bd porque é regra da empresa, eu não posso mudar o bd e tenho que achar uma solução para colocar a foto dos funcionários na tabela (inclusive, dei a sugestão de não gravar a foto no bd, mas acabamos por optar pela segurança de ter tudo registrado dentro de um mesmo bd).

Vou continuar tentando encontrar uma solução - se mais alguém tiver algo a ajudar - agradeço muito desde já.

Sds.

Sergio

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus, agradeço sinceramente sua resposta.

Aliás, você sempre ajuda vários colegas deste fórum - parabéns por sempre ajudar. Devemos muito ao seu conhecimento e boa vontade em passar para frente.

Obrigado pelas palavras.

Como não programo profissionalmente, acabo por produzir algo através destes auxílios. ;)

e aí deu o erro quando passa pelo post: "Invalid class typecast".

...

Referenciar um TBlobField para um campo tipo Oid no Postgree - acho que é isso o problema. Tentei encontrar outro tipo de campo no help do Delphi, mas o Delphi sempre define o blob para campos de imagem.

A origem da mensagem, muito provavelmente é esta mesmo. Aparentemente você não adicionou os campos no seu dataset, já que usa o FieldByName, mas você saberia dizer qual a classe de que estamos tratando? (certamente não é um TBlobField)

E qual o tipo deste campo definido no banco de dados?

É sempre complicado tentar ajudar em algo que não se tenha à mão para testar, mas assumindo que o campo no banco possa ser utilizado para o fim a que se destina e que a classe do campo no dataset possa fazer uso de stream (ser descendente de TBlobField), acredito que precisamos combinar as duas abordagens que você postou aqui. Veja como funcionará algo assim:

procedure TForm1.BtnGravarImagem(Sender :TObject);
var
  MS :TMemoryStream;
  jpg :TJpegImage;
begin
  if FileExists(Trim(mskedtMatricula.Text)+'.jpg') then
  begin
    jpg := TJpegImage.Create;
    try
      jpg.LoadFromFile('C:\SGP\Fotos\'+Trim(mskedtMatricula.Text)+'.jpg');
      MS := TMemoryStream.Create;
      try
        jpg.SaveToStream(MS);
        (dtmdlFolha.zqryServidor.FieldByName('ft_servidor') as TBlobField).LoadFromStream(MS);
      finally
        MS.Free;
      end;
    finally
      jpg.Free;
    end;
  end;
end;

veja que usamos o objeto jpg para carregar a imagem. Uma vez carregada a imagem, criamos o MemoryStream e movemos a imagem para ele e só então, carregamos ela para o campo na tabela.

São realmente os questionamentos que fiz acima.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...