Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Rodrigo_Lisboa

[Resolvido] Gravar imagem no sql server 2008 com sp usando vb.net 2008

Recommended Posts

Pessoal estou concluindo um programa no vb.net 2008 express, estou usando o banco de dados sql server 2008 express, o programa esta praticamente pronto, só esta faltando gravar a imagem em um cadastro do programa já fiz de tudo mas não consegui, na tabela criei um campo do tipo image, ai pesquisando na net, descobri que tem que converter a imagem para binario para poder gravar no banco ate ai eu consegui converti a imagem para binario e consegui gravar no banco, so que ele exibe na datagridview da tela a string em binario e não a imagem, e também quando eu quero recuperar a imagem para mostrala na picturebox novamente eu tendo fazer o processo de conversão mais ele da um erro falando que o tipo de dado System.Data.Linq.Binary não pode ser convertido para o tipo byte. Ja pesquisei um monte mas não consegui fazer, queria fazer basicamente assim você clica em um botão procurar foto acha a foto pode ser jpg, png ou bmp clica em abrir ele carrega a foto na picure (isso o programa já esta fazendo) depois clica em salvar ele adiciona o registro na tabela e atualiza a grid (isso o programa também já faz) so que na coluna da foto eu quero que apareça a foto que eu salvei e não a string enorme que esta aparecendo, e também na hora que eu fosse editar ou apagar o registro e clicasse em cima do mesmo com o mouse ele recuperasse a foto e carregasse ela na picturebox (isso eu sei como fazer estou usando stored procedure) mas não estou conseguindo fazer a conversão. será que alguém pode me ajudar? quero fazer isso usando stored procedure?

Muito Obrigado desde já...

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que você esta querendo é feito da segunite maneira (algoritmo geral para storage/retrieve de imagens):

NO BANCO DE DADOS:

-você nao vai trabalhar com o tipo "image" na coluna... você vai trabalhar com o tipo varbinary... o sua instancia do SQL e o banco vão ter que aceitar FILESTREAM...

-no seu banco você também vai ter que armazenar a extensao do arquivo associado (png/gif/jpeg)... isso você vai fazer em uma coluna aparte

NO SOFTWARE:

-o processo para gravação é:


//path é o caminho completo ate o arquivo, lembre-se de capturar a extensão
FileStream objFileStream = new FileStream(path, FileMode.Open);
byte[] Data = new byte[objFileStream.Length];
objFileStream.Read(Data, 0, Convert.ToInt32(objFileStream.Length));
//essas 3 linhas criam o FileStream e transforma o objeto apontado por path em um arquivo binario puro
SqlCommand objCommand = new SqlCommand("Bytes_Insert");
//Bytes_insert é um SP no banco que recebe o FileStream (aqui representado pela variavel DATA) e alguma outra informação que você quiser para colocar nas outras colunas
objCommand.Connection = objConnection;
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add(new SqlParameter("@Data", Data));
objCommand.Parameters.Add(new SqlParameter("@Livro", Livro));
objCommand.Parameters.Add(new SqlParameter("@Folha", Folha));
objCommand.Parameters.Add(new SqlParameter("@Termo", Termo));
objConnection.Open();
objCommand.ExecuteNonQuery();
objConnection.Close();
objFileStream.Close();
System.Windows.Forms.MessageBox.Show("Inserção Concluida com Sucesso");

-o processo de obtenção da imagem e exibição da imagem é simplesmente buscar o binario (o que você ja faz) e escreve-lo em disco associando a extensao... você vai receber o binario em um "byte[]" e vai escrevo com File.WriteAllBytes(local_onde_escrever, o_array_byte[]); agora que você ja tem a imagem em disco para exibi-la é só apontar o programa para ela...

dica: salve a imagem em uma pasta tipo temporaryfiles ou no final da execução apaguea para econimizar HD...

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • o que você esta querendo é feito da segunite maneira (algoritmo geral para storage/retrieve de imagens):

    NO BANCO DE DADOS:

    -você nao vai trabalhar com o tipo "image" na coluna... você vai trabalhar com o tipo varbinary... o sua instancia do SQL e o banco vão ter que aceitar FILESTREAM...

    -no seu banco você também vai ter que armazenar a extensao do arquivo associado (png/gif/jpeg)... isso você vai fazer em uma coluna aparte

    NO SOFTWARE:

    -o processo para gravação é:


    //path é o caminho completo ate o arquivo, lembre-se de capturar a extensão
    FileStream objFileStream = new FileStream(path, FileMode.Open);
    byte[] Data = new byte[objFileStream.Length];
    objFileStream.Read(Data, 0, Convert.ToInt32(objFileStream.Length));
    //essas 3 linhas criam o FileStream e transforma o objeto apontado por path em um arquivo binario puro
    SqlCommand objCommand = new SqlCommand("Bytes_Insert");
    //Bytes_insert é um SP no banco que recebe o FileStream (aqui representado pela variavel DATA) e alguma outra informação que você quiser para colocar nas outras colunas
    objCommand.Connection = objConnection;
    objCommand.CommandType = CommandType.StoredProcedure;
    objCommand.Parameters.Add(new SqlParameter("@Data", Data));
    objCommand.Parameters.Add(new SqlParameter("@Livro", Livro));
    objCommand.Parameters.Add(new SqlParameter("@Folha", Folha));
    objCommand.Parameters.Add(new SqlParameter("@Termo", Termo));
    objConnection.Open();
    objCommand.ExecuteNonQuery();
    objConnection.Close();
    objFileStream.Close();
    System.Windows.Forms.MessageBox.Show("Inserção Concluida com Sucesso");

    -o processo de obtenção da imagem e exibição da imagem é simplesmente buscar o binario (o que você ja faz) e escreve-lo em disco associando a extensao... você vai receber o binario em um "byte[]" e vai escrevo com File.WriteAllBytes(local_onde_escrever, o_array_byte[]); agora que você ja tem a imagem em disco para exibi-la é só apontar o programa para ela...

    dica: salve a imagem em uma pasta tipo temporaryfiles ou no final da execução apaguea para econimizar HD...

    Primeiramente obrigado pela ajuda...

    Tentei fazer aqui so que ainda esta dando erro, vamos lá

    Eu mudei na tabela do banco o campo image para Varbinary(MAX), e criei outra coluna para recerber a extensão da foto, também consegui fazer a conversão da foto e grava-la no banco o código ficou assim:


    nome_foto = dlg_foto.FileName
    Dim objFileStream As FileStream
    objFileStream = New FileStream(nome_foto, FileMode.Open)
    Dim Data(objFileStream.Length) As Byte
    objFileStream.Read(Data, 0, Convert.ToInt32(objFileStream.Length))

    Ai passei a variavel data como parametro para a stored procedure e gravou direitinho no banco aquela string enorme, so que na hora de converter de novo a imagem de binario para imagem esta dando o mesmo erro

    "Não é possível converter um objeto do tipo 'System.Data.Linq.Binary' no tipo 'System.Byte[]'."

    o codigo que eu estou usando para converter é o seguinte


    Dim figura() As Byte
    figura = Me.dgv_jogador.Item("Foto", plinha).Value 'da erro nessa linha
    File.WriteAllBytes("D:\", figura)

    Ele consegue gravar o arquivo binario nesse campo system.data.linq.binary mas na hora de converter ele da erro...você tem alguma sugestão?

    mais uma vez Muito Obrigado

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • você tem que fazer a conversão explicita (cast)

    Eu tentei fazer dessas duas formas mais ambas retornam o mesmo erro "Não é possível converter um objeto do tipo 'System.Data.Linq.Binary' no tipo 'System.Byte[]'."


    figura = CType((Me.dgv_jogador.Item("Foto", plinha).Value), Byte())

    figura = DirectCast((Me.dgv_jogador.Item("Foto", plinha).Value), Byte())

    Alguma sugestão do que eu possa fazer???

    Muito Obrigado mais uma vez

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    tenta:

    figura = (byte[])Me.dgv_jogador.Item("Foto", plinha).Value;

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • tenta:

    figura = (byte[])Me.dgv_jogador.Item("Foto", plinha).Value;

    Pessoal podem fechar o topico já resolvi o problema...

    Muito Obrigado a todos que me ajudaram...

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Visitante
    Este tópico está impedido de receber novos posts.
    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×