Ir ao conteúdo
  • Cadastre-se

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


Rodrigo_Lisboa

Posts recomendados

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á...

Link para o comentário
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...

Link para o comentário
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...

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!