Retornar imagem cadastrada no banco de dados

Boa tarde, venho tendo dificuldades de retornar uma imagem que está gravada no meu banco de dados para uma picturebox, eu já tentei de várias maneiras, mas não estou obtendo exito.

Nesse bloco eu faço a conversão da imagem para um array de bytes:

private void button2_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string nomeArquivo = openFileDialog1.FileName;
                Bitmap bmp = new Bitmap(nomeArquivo);
                pbImagem.Image = bmp;

                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Bmp);
                byte[] foto = ms.ToArray();
            }
        }

Nesse outro eu faço o cadastro dos dados incluindo o da imagem no banco de dados:

private void btnCadastrar_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(DadosDaConexao.StringDaConexao);
            SqlCommand cmd = new SqlCommand("uspInserirProdutos", con);
            cmd.Parameters.AddWithValue("@COD_PRODUTO", txtCodigo.Text);
            cmd.Parameters.AddWithValue("@DESCRICAO_PRODUTO", txtDescricao.Text);
            cmd.Parameters.AddWithValue("@ACABAMENTO_PRODUTO", txtAcabamento.Text);
            cmd.Parameters.AddWithValue("@IMAGEM_PRODUTO", SqlDbType.Binary);
            cmd.Parameters.AddWithValue("@FABRICANTE_PRODUTO", txtFabricante.Text);
            cmd.Parameters.AddWithValue("@OBS_PRODUTO", txtObservacao.Text);
            cmd.Parameters.AddWithValue("@MEDIDA_PRODUTO", Convert.ToDouble(txtMedida.Text));
            cmd.Parameters.AddWithValue("@PESO_PRODUTO", Convert.ToDouble(txtPeso.Text));

            cmd.CommandType = CommandType.StoredProcedure;

            con.Open();
            if (cmd.ExecuteNonQuery() > 0)
            {
                MessageBox.Show("Produto cadastrado com sucesso!");
            }
            else
            {
                MessageBox.Show("Não foi possivel cadastrar o produto");
            }
            con.Close();           
        }

E aqui eu tento fazer a leitura:

private void btnConsultar_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(DadosDaConexao.StringDaConexao);
            SqlCommand cmd = new SqlCommand("uspConsultarProdutos", con);
            cmd.Parameters.AddWithValue("@COD_PRODUTO", txtCodigo.Text);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataReader reader;
            con.Open();

            try
            {
                reader = cmd.ExecuteReader();
                Image images = null;
                if (reader.Read())
                {
                    txtCodigo.Text = reader[1].ToString();
                    txtAcabamento.Text = reader[3].ToString();
                    txtDescricao.Text = reader[2].ToString();
                    txtFabricante.Text = reader[4].ToString();
                    txtPeso.Text = reader[6].ToString();
                    txtMedida.Text = reader[5].ToString();
                    txtObservacao.Text = reader[7].ToString();

                    byte[] foto = (byte[])reader[8];
                    MemoryStream ms = new MemoryStream(foto);
                    Bitmap bmp = new Bitmap(ms);
                    pbImagem.Image = bmp;
                }
                else
                {
                    MessageBox.Show("Nenhum código encontrado!");
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro: " + ex.ToString());
            }
            con.Close();
        }

Eu não sei em que ponto do código eu estou errando, mas na hora que faço a consulta, eu recebo um exeception de parâmetro inválido na linha do bloco da consulta:

Bitmap bmp = new Bitmap(ms);

Se alguém puder me ajudar, seria grato. Já procurei em alguns fóruns como armazenar o caminho da imagem no banco e fazer uma cópia dela em uma pasta e depois retornar a imagem pelo caminho na consulta, mas não entendo como fazer dessa forma.

1 curtida

Pelo que pude perceber você não está gravando a imagem no banco:

cmd.Parameters.AddWithValue("@IMAGEM_PRODUTO", SqlDbType.Binary);

deveria ser assim:

 ///byte[] foto 
 cmd.Parameters.AddWithValue("@IMAGEM_PRODUTO", SqlDbType.Binary).Value = foto;

Dá uma olhada porque não está indo foto para o banco eu acho !!!