Usuário com melhor resposta
Inserir Imagens no Banco usando LINQ

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
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
Todas as Respostas
-
-
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 -
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
-
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 -
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
-
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.