none
Gravar imagem no FireBird RRS feed

  • Pergunta

  • Pessoal eu andei pesquisando ai sobre gravar imagem no banco de dados mas não entendi muito

    eu estou usando o seguinte cod.

    private void imagemFundoToolStripMenuItem_Click(object sender, EventArgs e)
            {
                openImagem.ShowDialog();
                pbImagemLogo.Load(openImagem.FileName);
                Image imagem = pbImagemLogo.Image;
                string strComm = "Insert into T_imagem (imagem) values (";
                strComm += CodificarFoto(imagem);
                strComm += ")";
                conneccao.ExecutarComando(strComm);
            }
    
            public Byte[] CodificarFoto(Image foto)
            {
    
                MemoryStream ms = new MemoryStream();
    
                foto.Save(ms, ImageFormat.Jpeg ); //<--- Erro genérico de GDI+
    
                Byte[] myData = new Byte[ms.Length];
    
                myData = ms.ToArray();
    
                return myData;
    
            }

    Mas não esta dando certo como eu resolvo?

    quinta-feira, 29 de agosto de 2013 22:57

Respostas

  • private void ButAbrir_Click(object sender, EventArgs e)
    {
    	TxtFotoName.Text = "";
    	OpenFileFotos.ShowDialog();
    	if (!string.IsNullOrEmpty(OpenFileFotos.FileName))
    	{
    		TxtFotoName.Text = OpenFileFotos.FileName;
    	}
    }
    
    private void ButGravar_Click(object sender, EventArgs e)
    {
    	if (!String.IsNullOrEmpty(TxtFotoName.Text))
    	{
    		if (new FileInfo(TxtFotoName.Text).Exists)
    		{
    			Image Image1 = Image.FromFile(TxtFotoName.Text);
    			using (SqlConnection Conexao = new SqlConnection(@"Data Source=.\SqlExpress;Initial Catalog=DBanco;Persist Security Info=True;User ID=sa;Password=senha"))
    			{
    				Conexao.Open();
    				using (SqlCommand Comando = Conexao.CreateCommand())
    				{
    					Comando.CommandType = CommandType.Text;
    					Comando.CommandText = "INSERT INTO TbFotos (Fotos) values(@Fotos);";
    					Comando.Parameters.Add("@Fotos", SqlDbType.Image).Value = ConvertImageToByteArray(Image1, ImageFormat.Jpeg);
    					if (Comando.ExecuteNonQuery() > 0)
    					{
    						MessageBox.Show("Imagem gravada com êxito", "Imagem: Ok", MessageBoxButtons.OK, MessageBoxIcon.Information);
    					}
    				}
    				Conexao.Close();
    			}
    		}
    		else
    		{
    			MessageBox.Show("Imagem inválida", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    		}
    	}
    }
    public byte[] ConvertImageToByteArray(Image image, ImageFormat imageFormat)
    {
    	if (image == null)
    		return null;
    	MemoryStream ms = new MemoryStream();
    	image.Save(ms, imageFormat); 
    	return ms.ToArray();
    }
    
    public Image ConvertByteArrayToImage(byte[] byteArray)
    {
    	if (byteArray == null || byteArray.Length == 0)
    	{ return (null); }
    	return (Image.FromStream(new MemoryStream(byteArray)));
    }
    
    private void ButAparecer_Click(object sender, EventArgs e)
    {
    	Image Image1 = null;    
    	using (SqlConnection Conexao = new SqlConnection(@"Data Source=.\SqlExpress;Initial Catalog=DBanco;Persist Security Info=True;User ID=sa;Password=senha"))
    	{
    		Conexao.Open();
    		using (SqlCommand Comando = Conexao.CreateCommand())
    		{
    			Comando.CommandType = CommandType.Text;
    			Comando.CommandText = "SELECT * FROM TbFotos WHERE Id=@Id";
    			Comando.Parameters.Add("@Id", SqlDbType.Int).Value = int.Parse(TxtId.Text);
    			using (SqlDataReader Reader = Comando.ExecuteReader())
    			{
    				if (Reader.HasRows)
    				{
    					Reader.Read();
    					Image1 = ConvertByteArrayToImage((Reader["Fotos"] as byte[]));
    				}
    			}
    		}
    		Conexao.Close();
    	}
    	if (Image1 != null)
    	{
    		PictureBoxImagem.Image = Image1;
    		PictureBoxImagem.Refresh();
    		PictureBoxImagem.Update();
    	}
    }

    Coloquei para você todo o código mas, utilizando o banco SQLServer, mas, no seu caso o que vai mudar só são as Classes de instanciação porque o resto dos comandos são os mesmo ...

    A charada está nessa linha se não pode passar direto em uma string tem que ser pelo paramenter

    Comando.Parameters.Add("@Fotos", SqlDbType.Image).Value = ConvertImageToByteArray(Image1, ImageFormat.Jpeg);


    Fúlvio Cezar Canducci Dias

    sexta-feira, 30 de agosto de 2013 01:48

Todas as Respostas

  • private void ButAbrir_Click(object sender, EventArgs e)
    {
    	TxtFotoName.Text = "";
    	OpenFileFotos.ShowDialog();
    	if (!string.IsNullOrEmpty(OpenFileFotos.FileName))
    	{
    		TxtFotoName.Text = OpenFileFotos.FileName;
    	}
    }
    
    private void ButGravar_Click(object sender, EventArgs e)
    {
    	if (!String.IsNullOrEmpty(TxtFotoName.Text))
    	{
    		if (new FileInfo(TxtFotoName.Text).Exists)
    		{
    			Image Image1 = Image.FromFile(TxtFotoName.Text);
    			using (SqlConnection Conexao = new SqlConnection(@"Data Source=.\SqlExpress;Initial Catalog=DBanco;Persist Security Info=True;User ID=sa;Password=senha"))
    			{
    				Conexao.Open();
    				using (SqlCommand Comando = Conexao.CreateCommand())
    				{
    					Comando.CommandType = CommandType.Text;
    					Comando.CommandText = "INSERT INTO TbFotos (Fotos) values(@Fotos);";
    					Comando.Parameters.Add("@Fotos", SqlDbType.Image).Value = ConvertImageToByteArray(Image1, ImageFormat.Jpeg);
    					if (Comando.ExecuteNonQuery() > 0)
    					{
    						MessageBox.Show("Imagem gravada com êxito", "Imagem: Ok", MessageBoxButtons.OK, MessageBoxIcon.Information);
    					}
    				}
    				Conexao.Close();
    			}
    		}
    		else
    		{
    			MessageBox.Show("Imagem inválida", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    		}
    	}
    }
    public byte[] ConvertImageToByteArray(Image image, ImageFormat imageFormat)
    {
    	if (image == null)
    		return null;
    	MemoryStream ms = new MemoryStream();
    	image.Save(ms, imageFormat); 
    	return ms.ToArray();
    }
    
    public Image ConvertByteArrayToImage(byte[] byteArray)
    {
    	if (byteArray == null || byteArray.Length == 0)
    	{ return (null); }
    	return (Image.FromStream(new MemoryStream(byteArray)));
    }
    
    private void ButAparecer_Click(object sender, EventArgs e)
    {
    	Image Image1 = null;    
    	using (SqlConnection Conexao = new SqlConnection(@"Data Source=.\SqlExpress;Initial Catalog=DBanco;Persist Security Info=True;User ID=sa;Password=senha"))
    	{
    		Conexao.Open();
    		using (SqlCommand Comando = Conexao.CreateCommand())
    		{
    			Comando.CommandType = CommandType.Text;
    			Comando.CommandText = "SELECT * FROM TbFotos WHERE Id=@Id";
    			Comando.Parameters.Add("@Id", SqlDbType.Int).Value = int.Parse(TxtId.Text);
    			using (SqlDataReader Reader = Comando.ExecuteReader())
    			{
    				if (Reader.HasRows)
    				{
    					Reader.Read();
    					Image1 = ConvertByteArrayToImage((Reader["Fotos"] as byte[]));
    				}
    			}
    		}
    		Conexao.Close();
    	}
    	if (Image1 != null)
    	{
    		PictureBoxImagem.Image = Image1;
    		PictureBoxImagem.Refresh();
    		PictureBoxImagem.Update();
    	}
    }

    Coloquei para você todo o código mas, utilizando o banco SQLServer, mas, no seu caso o que vai mudar só são as Classes de instanciação porque o resto dos comandos são os mesmo ...

    A charada está nessa linha se não pode passar direto em uma string tem que ser pelo paramenter

    Comando.Parameters.Add("@Fotos", SqlDbType.Image).Value = ConvertImageToByteArray(Image1, ImageFormat.Jpeg);


    Fúlvio Cezar Canducci Dias

    sexta-feira, 30 de agosto de 2013 01:48
  • Cara muito obrigado, implementar isso no meu projeto vai ser dureza rsrsr
    Entendi quase tudo...

    sexta-feira, 30 de agosto de 2013 03:25
  • Qualquer dúvida estamos ai para ajudar!!!

    Só me contemple com um voto!!! eu agradeço!


    Fúlvio Cezar Canducci Dias

    sexta-feira, 30 de agosto de 2013 14:19