none
Inserir Imagens no Banco usando LINQ RRS feed

  • Pergunta

  • E ai pessoal, tudo bem?

    Bom venho aqui pedir uma ajudinha, pois estou querendo inserir uma imagem no banco de dados SQL, usando o LINQ.

    Nao estou tendo sucesso. Jah consegui usando ADO, dando insert via SQL mesmo, desse modo era só ler a imagem e colocar como binario, depois inserir.


    Já tentei várias coisas com o linq e nada. se alguem souber, por favor.

    O fomr é simples, só um grid, alguns registros e o pictureBox onde eu rodo a imagem.


    Qualquer ajuda é bem vinda. Obrigadoo

    Abraços...

    Rodolfo Leão
    sexta-feira, 2 de outubro de 2009 15:18

Respostas

  • Olá Fred,

    Boas noticias, depois de tentar bastante, consegui inserir as imagens sem ter que improvisar uma instrução SQL no meu código.
    Foi simples, e a solução saiu quando eu estava bem descontraido, nem esquentando mto...ehhehe

    Consegui assim:


    Primeiramente, no DBML, precisa mudar o tipo de dados para "byte[]" da coluna foto, da tabela que virou uma classe mapeada do banco de dados, e no banco de dados essa coluna da tabela precisa ser do Tipo "Image". Precisa ser assim, porque quando se captura a imagem do local, é necessario transformá-la em um array de bytes, para poder inserir no banco de dados.

    Bom, vou colocar o código aqui, talvez seja útil para mais alguem! (Obs.: não implementei o processo reverso, ou seja este código somente adiciona uma imagem no banco, e não exporta ou salva a partir do banco, mas caso precisem, é só me falar queenho aqui, é tudo uma questão de adaptação).


    Primeiramente, é necessário um botão para abrir uma caixa de dialogo para que se possa selecionar uma imagem a ser incluida no banco. É bom colocar tambem um pictureBox, para ver a imagem que foi selecionada. O código abaixo, entra na evento click do botão.

            private void btnSelecionaFoto_Click(object sender, EventArgs e)
            {
    
                OpenFileDialog dlg = new OpenFileDialog();
    
    //titulo da janela
                dlg.Title = "Abrir Foto";
    //Extenções de arquivos que são permitidos selecionar.
                dlg.Filter = "JPG (*.jpg)|*.jpg"
                    + "|All files (*.*)|*.*";
    
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
    
    //atribui a imagem selecionada ao "pictureBox". Neste caso o "pbFoto".
    
                        pbFoto.Image = new Bitmap(dlg.OpenFile());
                        foto = dlg.FileName;
                        
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Não foi possivel carregar a foto: " + ex.Message);
                    }
                }
    
    //libera os recursos usados no IO.
    
                dlg.Dispose();
    
            }
    O código abaixo pega a string do caminho da foto, converte a foto em um array de bytes.

            public static byte[] GetFoto(string caminhoArquivoFoto)
            {
     
                FileStream fs = new FileStream(caminhoArquivoFoto, FileMode.Open, FileAccess.Read);
    
    //invoca o BinaryReader e passa o "fs" que é o caminho da foto como parâmetro.
    
                BinaryReader br = new BinaryReader(fs);
    
    //array de bytes para guardar a imagem. pega o tamanho do "fs" para ler usando a variavel "br" que é do tipo BinaryReader, executa metodo de leitura e atribue ao array de byte "foto"
    
                byte[] foto = br.ReadBytes((int)fs.Length);
    
                br.Close();
    
                fs.Close();
               
                return foto;
            }
    E agora o código que vai no evento click do botão gravar:

    private void SalvarFoto_Click(object sender, EventArgs e)
            {               
    
                   TabelaFotos novaFoto = new TabelaFotos();
    
    //Atribue o array de bytes a coluna a ser armazenado no banco, no caso "fto_foto".
                    novaFoto.fto_foto = GetFoto(foto);
    
    //finaliza a edição.
                    this.TabelaFotosBindingSource.EndEdit();
    
    //aplica as alterações.
                    DataContext.SubmitChanges();
    }
    Bom, é isso ai, consegui assim, espero que seja útil para mais alguem.
    Sou iniciante em C# e LINQ, mas sempre que eu puder ajudar estarei fazendo.
    Abraços a todos.
    Rodolfo Leão
    • Sugerido como Resposta Murilo Amaru Gomes sábado, 24 de outubro de 2009 03:29
    • Marcado como Resposta Harley Araujo sexta-feira, 30 de abril de 2010 10:24
    segunda-feira, 5 de outubro de 2009 09:48

Todas as Respostas

  • Como é seu objeto que representa a tabela no banco. Acredito que seja através de array de bytes. Mostre-me sua classe e consulta LINQ

    Fred Policarpo - MCT, MCTS [Win, WPF, WF] http://twitter.com/fredpolicarpo
    sexta-feira, 2 de outubro de 2009 20:19
  • Olá, deculpa a demora para responder.

    O último post ficou desordenado e com algumas informações truncadas.

    Mas respondendo:

    Faço assim, eu mapeio as tabelas do banco em um objeto .dbml (Linq to SQL Classes) e a partir daí eu acesso os dados atravez de um DataContext.

    Acredito que esta seja minha classe DBML :

    public partial class VimaqLinqDataContext : System.Data.Linq.DataContext


    O codigo abaixo é um exemplo de consulta Linq funcionando no meu projeto. Este objeto DataContextFactory, é simplismente para criar um novo DataContext.

                var retorno = from t in DataContextFactory.DataContext.Usuarios
                              where
                                t.nm_usuario == txtUsuario.Text.Trim().ToString() &&
                                t.se_senha == txtSenha.Text.Trim().ToString()
                              select new
                              {
                                  t.nm_usuario,
                                  t.se_senha
                              };

    Codigo do meu objeto criador de DataContext:


        public class DataContextFactory
        {
            private static VimaqLinqDataContext dataContext;
            public static VimaqLinqDataContext DataContext
            {
                get
                {
                    if (dataContext == null)
                    
                        dataContext = new VimaqLinqDataContext();
    
                        return dataContext;
                    
                }
            }
        }


    Vou colocar o código que estou usando atualemente.
    O código abaixo abre uma caixa de dialogo para seleção de foto, e mostra ela em um pictureBox no form.

            private void btnSelecionaFoto_Click(object sender, EventArgs e)
            {
    
                string foto = null;
                SqlConnection conn;
                conn = new SqlConnection("Data Source=RODOLFO-PC\\SQLEXPRESS;Initial Catalog=vimaqdb;Integrated Security=True");
    
                OpenFileDialog dlg = new OpenFileDialog();
    
                dlg.Title = "Abrir Foto";
                dlg.Filter = "JPG (*.jpg)|*.jpg"
                    + "|All files (*.*)|*.*";
    
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        pbFoto.Image = new Bitmap(dlg.OpenFile());
                        foto = dlg.FileName;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Não foi possivel carregar a foto: " + ex.Message);
                    }
                }
    
                dlg.Dispose();
    
            }


    O código abaixo captura o caminho da foto:

            public static byte[] GetFoto(string caminhoArquivoFoto)
            {
                
                FileStream fs = new FileStream(caminhoArquivoFoto, FileMode.Open, FileAccess.Read);
    
                BinaryReader br = new BinaryReader(fs);
    
                byte[] foto = br.ReadBytes((int)fs.Length);
    
    
                br.Close();
    
                fs.Close();
    
                return foto;
            }

    O código Abaixo inclui uma imagem no banco, está em SQL, já tentei usando o equivalente em Linq, mas as duas formas retorna um erro, que diz que o Path do caminho da imagem não pode ser nulo.


            public void IncluiFoto(string pcaminhoFoto)
            {
                SqlConnection conn;
                conn = new SqlConnection("Data Source=RODOLFO-PC\\SQLEXPRESS;Initial Catalog=vimaqdb;Integrated Security=True");
    
                // Le a imagem em um array de bytes do arquivo de sistemas
    
                byte[] fotoImagem = GetFoto(pcaminhoFoto);
    
       
                // MOnta a instrucao SQL
    
                SqlCommand incFoto = new SqlCommand("INSERT INTO fto_foto (" + "foto) " + "VALUES(@foto)", conn);
    
    
                incFoto.Parameters.Add("@foto", SqlDbType.Image, foto.Length).Value = fotoImagem;
    
                // Abre a conexao e inclui o BLOB na tabela
    
                try
                {
    
                    conn.Open();
    
                    incFoto.ExecuteNonQuery();
    
                }
    
                catch (Exception ex)
                {
    
                    MessageBox.Show("Erro ao incluir dados : " + ex.Message);
    
                }
    
                finally
                {
    
                    conn.Close();
    
                } 
                
            }


    Bom, é assim que estou tentando, se tiver um caminho mais certo de fazer, ficarei feliz em saber. : )

    Obrigado por responder, quero me desculpar pela quantidade de código.

    Espero contato.

    Abraços...


    Rodolfo Leão
    domingo, 4 de outubro de 2009 05:24
  • Olá Fred,

    Boas noticias, depois de tentar bastante, consegui inserir as imagens sem ter que improvisar uma instrução SQL no meu código.
    Foi simples, e a solução saiu quando eu estava bem descontraido, nem esquentando mto...ehhehe

    Consegui assim:


    Primeiramente, no DBML, precisa mudar o tipo de dados para "byte[]" da coluna foto, da tabela que virou uma classe mapeada do banco de dados, e no banco de dados essa coluna da tabela precisa ser do Tipo "Image". Precisa ser assim, porque quando se captura a imagem do local, é necessario transformá-la em um array de bytes, para poder inserir no banco de dados.

    Bom, vou colocar o código aqui, talvez seja útil para mais alguem! (Obs.: não implementei o processo reverso, ou seja este código somente adiciona uma imagem no banco, e não exporta ou salva a partir do banco, mas caso precisem, é só me falar queenho aqui, é tudo uma questão de adaptação).


    Primeiramente, é necessário um botão para abrir uma caixa de dialogo para que se possa selecionar uma imagem a ser incluida no banco. É bom colocar tambem um pictureBox, para ver a imagem que foi selecionada. O código abaixo, entra na evento click do botão.

            private void btnSelecionaFoto_Click(object sender, EventArgs e)
            {
    
                OpenFileDialog dlg = new OpenFileDialog();
    
    //titulo da janela
                dlg.Title = "Abrir Foto";
    //Extenções de arquivos que são permitidos selecionar.
                dlg.Filter = "JPG (*.jpg)|*.jpg"
                    + "|All files (*.*)|*.*";
    
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
    
    //atribui a imagem selecionada ao "pictureBox". Neste caso o "pbFoto".
    
                        pbFoto.Image = new Bitmap(dlg.OpenFile());
                        foto = dlg.FileName;
                        
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Não foi possivel carregar a foto: " + ex.Message);
                    }
                }
    
    //libera os recursos usados no IO.
    
                dlg.Dispose();
    
            }
    O código abaixo pega a string do caminho da foto, converte a foto em um array de bytes.

            public static byte[] GetFoto(string caminhoArquivoFoto)
            {
     
                FileStream fs = new FileStream(caminhoArquivoFoto, FileMode.Open, FileAccess.Read);
    
    //invoca o BinaryReader e passa o "fs" que é o caminho da foto como parâmetro.
    
                BinaryReader br = new BinaryReader(fs);
    
    //array de bytes para guardar a imagem. pega o tamanho do "fs" para ler usando a variavel "br" que é do tipo BinaryReader, executa metodo de leitura e atribue ao array de byte "foto"
    
                byte[] foto = br.ReadBytes((int)fs.Length);
    
                br.Close();
    
                fs.Close();
               
                return foto;
            }
    E agora o código que vai no evento click do botão gravar:

    private void SalvarFoto_Click(object sender, EventArgs e)
            {               
    
                   TabelaFotos novaFoto = new TabelaFotos();
    
    //Atribue o array de bytes a coluna a ser armazenado no banco, no caso "fto_foto".
                    novaFoto.fto_foto = GetFoto(foto);
    
    //finaliza a edição.
                    this.TabelaFotosBindingSource.EndEdit();
    
    //aplica as alterações.
                    DataContext.SubmitChanges();
    }
    Bom, é isso ai, consegui assim, espero que seja útil para mais alguem.
    Sou iniciante em C# e LINQ, mas sempre que eu puder ajudar estarei fazendo.
    Abraços a todos.
    Rodolfo Leão
    • Sugerido como Resposta Murilo Amaru Gomes sábado, 24 de outubro de 2009 03:29
    • Marcado como Resposta Harley Araujo sexta-feira, 30 de abril de 2010 10:24
    segunda-feira, 5 de outubro de 2009 09:48
  • Rodolfo,

    Obrigado pela sua colaboração. Estou fazendo um projeto no Windows Forms, com C# e LINQ.

    Estou com algumas dúvidas e se voce puder ajudar, precisava de uma ajuda.

    Se tiver algum e-mail ou msn pra contato e puder me passar fico agradecido. Obrigado

    Meu Email: diegoaferraz@gmail.com
    sexta-feira, 23 de outubro de 2009 11:44
  • Espero poder ajudar em qualquer dúvida.


    Abraços

    Rodolfo Leão
    • Editado Rodolfo Leão quinta-feira, 26 de novembro de 2009 01:31 Private
    sábado, 24 de outubro de 2009 03:32
  • Rodolfo, seu codigo foi muito util para mim, agradeço a sua atitude em ajudar.

    gostaria de lhe pedir uma ajuda ou a algum amigo aqui do forum. estou com um  problema quando finalizo a edição

    //finaliza a edição. this.TabelaFotosBindingSource.EndEdit();

    minha tabela não apareçe vc poderia ajudar ?

    grato ricardo.

    quinta-feira, 6 de junho de 2013 14:29