none
Inserindo Imagens no SQL Server 2008 RRS feed

  • Pergunta

  • Boa tarde!

    Bom gente, eu tenho uma aplicação em VB6 que cadastra currículos e agora eu preciso permitir que este sistema possa inserir fotos dos candidatos, o desenvolvimento desta aplicação utiliza passagem de parâmetro e o banco é o SQL Server 2008.

    Tentei fazer uma SP de insert comum e não funcionou pq descobri q o SQL não consegue fazer isto sozinho, então tentei utilizar OPENROWSET exibia a mensagem de erro "Você não tem permissão para utilizar o comando OPENROWSET ", eu não tenho acesso direto ao BD.

    No meu caso salvar o caminho não é a melhor solução, pq vários usuários de lugares diferentes podem inserir imagens e como eu disse eu não tenho acesso direto ao BD para criar a pasta lá e colocar algum tipo de bloquei de segurança na mesma.

    Então... socorro!!!! Tem salvação para mim????

    sexta-feira, 18 de janeiro de 2013 16:35

Respostas

  • Obrigada pela ajuda,mas esta página eu já tinha visto. 

    Tu já viu isso: http://www.go4expert.com/forums/showthread.php?t=879

    ele passa como um parametro comum para a procedure


    Twitter: @MayogaX
    Blog: Dev Blog

    • Marcado como Resposta Ricardo Russo segunda-feira, 21 de janeiro de 2013 12:07
    sexta-feira, 18 de janeiro de 2013 18:29
  • Olá Elizabeth...

    Vou deixar aqui minha opinião.

    Para armazenar documentos (Imagens, Texto, Planilhas, Apresentações etc) eu utilizo um banco de dados NonSQL chamado MongoDB, ele armazena dos dados no formato JSON;

    Gravo numa tabela do SQLServer somente a ID do registro (do MongoDB) do documento e a extensão (JPG, PDF, DOC etc).

    Dessa forma eu descentralizo completamente o armazenamento dos dados, com isso ganho em:

    Escalabilidade - pois não há limitação do tamanho do campo/registro;

    Portabilidade - pois os bancos e backups do SQLServer ficam "normais" por assim dizer;

    Velocidade - Por se tratar de um banco "não SQL" não há consulta, a referencia da localização tem de ser passada.

    Lembro que desenvolvo em C# e já uso esse recurso desde o C++ passando pelo Delphi/Pascal.

    Abraço a todos.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    • Marcado como Resposta Ricardo Russo segunda-feira, 21 de janeiro de 2013 12:07
    sexta-feira, 18 de janeiro de 2013 19:49

Todas as Respostas

  • Eu imagino que o caso seria criar um camplo do tipo BLOB, ver mais na MSDN

    Uma coisa que você vai precisar é no seu código VB serializar a imagem para mandar para o SQL Server.


    Twitter: @MayogaX
    Blog: Dev Blog

    sexta-feira, 18 de janeiro de 2013 17:01
  • Isso eu acho q consegui fazer no VB6, mas não consegui testar pq como não criei a SP então dá erro.
    sexta-feira, 18 de janeiro de 2013 17:03
  • Isso foi discutido:

    http://social.msdn.microsoft.com/Forums/pt/transactsqlpt/thread/dc69abab-174a-4282-9d23-e33c7c1a2e15

    Achei este link intessante:

    http://forum.clubedohardware.com.br/resolvido-gravar-imagem/665771

    Att.


    sexta-feira, 18 de janeiro de 2013 17:11
  • Olá Elizabeth, tem um post excelente sobre o assunto de um dos nossos moderadores o Pedro Galvão Júnior, falando a respeito de inserção de imagens no SQL Server 2008, de repente tu consegue tirar algumas dicas do que fazer:

    http://pedrogalvaojunior.wordpress.com/2012/07/20/dica-armazenando-arquivos-de-imagem-no-sql-server-2008-e-r2-atraves-do-comando-openrowset-em-conjunto-com-a-opcao-bulk/

    Espero que ajude, vlew.


    --
    Marcus Vinícius Bittencourt
    blog: isqlserver.wordpress.com
    www.sqlserverRS.com.br

    sexta-feira, 18 de janeiro de 2013 17:15
  • Obrigada pela ajuda,mas esta página eu já tinha visto. 
    sexta-feira, 18 de janeiro de 2013 17:37
  • Obrigada pela ajuda,mas esta página eu já tinha visto. 

    Tu já viu isso: http://www.go4expert.com/forums/showthread.php?t=879

    ele passa como um parametro comum para a procedure


    Twitter: @MayogaX
    Blog: Dev Blog

    • Marcado como Resposta Ricardo Russo segunda-feira, 21 de janeiro de 2013 12:07
    sexta-feira, 18 de janeiro de 2013 18:29
  • Olá Elizabeth...

    Vou deixar aqui minha opinião.

    Para armazenar documentos (Imagens, Texto, Planilhas, Apresentações etc) eu utilizo um banco de dados NonSQL chamado MongoDB, ele armazena dos dados no formato JSON;

    Gravo numa tabela do SQLServer somente a ID do registro (do MongoDB) do documento e a extensão (JPG, PDF, DOC etc).

    Dessa forma eu descentralizo completamente o armazenamento dos dados, com isso ganho em:

    Escalabilidade - pois não há limitação do tamanho do campo/registro;

    Portabilidade - pois os bancos e backups do SQLServer ficam "normais" por assim dizer;

    Velocidade - Por se tratar de um banco "não SQL" não há consulta, a referencia da localização tem de ser passada.

    Lembro que desenvolvo em C# e já uso esse recurso desde o C++ passando pelo Delphi/Pascal.

    Abraço a todos.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    • Marcado como Resposta Ricardo Russo segunda-feira, 21 de janeiro de 2013 12:07
    sexta-feira, 18 de janeiro de 2013 19:49
  • Eu consegui salvar no banco, mas não estou conseguindo ler vcs conhecem uma forma diferente para ler imagem ser usar GetChunk e ActualSize? Estou usando VB6.

    Obrigada a todos pela ajuda e boa semana!!!

    segunda-feira, 4 de fevereiro de 2013 17:23
  • Elizabeth,

    Segue um exemplo pratico em C#, talvez consiga adapta-lo em VB6:

    //Insere imagem banco

    int intCodigo = Convert.ToInt32(Arquivo.Name.Substring(0, Arquivo.Name.IndexOf('.'))
    bytes[] byArquivo = File.ReadAllBytes(Arquivo.Directory + "\\" + Arquivo.Name);
    
    
    cCommand.CommandText = "UPDATE premioCH_professor SET IMAGEM=@IMAGEM WHERE CodFuncionario=@CODFUNC";
    
    SqlParameter[] parameter = new SqlParameter[2];
    
    parameter[0] = new SqlParameter("@CODFUNC", intCodigo);
    parameter[1] = new SqlParameter("@IMAGEM", byArquivo);
    
    foreach (SqlParameter item in parameter)
    {
       cCommand.Parameters.Add(item);
    }
    
    cCommand.ExecuteNonQuery();

    //Recupero para um PictureBox

    DataTable dtRetorno = objRecupera.RecuperarImagem(Convert.ToInt32(txtCodigo.Text));
    
    MemoryStream stream = new MemoryStream((byte[])dtRetorno.Rows[0]["IMAGEM"]);
    pictureBox1.Image = Image.FromStream(stream);

    Espero que isso lhe dê melhores ideias.


    Atenciosamente, Samuel dos Anjos

    segunda-feira, 4 de fevereiro de 2013 22:23
  • Tenho uma SP que lê a imagem no BD, mas ao chegar na programação o valor vem diferente?Estou desenvolvendo em VB6.

    Esta é minha SP:

    ALTER PROCEDURE [dbo].[sp_Foto_Candidato_ler]
                   
                   ( @Id_Candidato INTEGER )

    WITH RECOMPILE
    AS
    SET NOCOUNT ON

    BEGIN TRANSACTION

    -- Seleciona Foto na tabela Foto
    SELECT Foto 
     FROM Foto FT
    WHERE FT.id_candidato = @Id_Candidato
     
    IF @@ERROR <> 0 BEGIN
       RAISERROR ('Problemas na Leitura da Foto!', 16, 1)
       GOTO FINAL_ERRO
    END


    GOTO FINAL_SP
    FINAL_ERRO:
    ROLLBACK TRANSACTION
    SET NOCOUNT OFF
    RETURN (-10)
    FINAL_SP:
    COMMIT TRANSACTION
    SET NOCOUNT OFF

    Ao passar o parâmetro o valor exibido no BD é: '0x31'

    Mas no desenvolvimento (programação) o valor exibido é: "1"

    e aparece o erro " '3201' BOF ou EOF são verdadeiros, ou o registro atual foi excluído. A operação solicitada pelo aplicativo requer um valor atual."

    sexta-feira, 14 de junho de 2013 14:55