"C#" - The parameterized @image bi query expects the @image parameter that was not provided!

Asked

Viewed 284 times

2

Guys, I am creating a cash system and in the change the registration part the program gives the following error "The query parametrized @imagem bi expects the parameter @imagem that was not provided!". Funny thing is that when I put a new photo, it works normally! Already when I change only the name, this error appears!

Code below!

//O código abaixo é referente ao botão "Carregar Foto".

    int novaFoto;
    byte [] foto;
    Bitmap bmp;

    private void Button1_Click(object sender, EventArgs e)
    {

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string caminho = openFileDialog1.FileName;

            bmp = new Bitmap(caminho);

            pictureBox1.Image = bmp;

            novaFoto += 1;

        }

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void textBox3_TextChanged(object sender, EventArgs e)
    {

    }

    //O código abaixo é referente ao botão "Alterar Cadastro".


    string nomeBanco;


    private void button2_Click(object sender, EventArgs e)
    {
        if (novaFoto != 0)

        { 
            MemoryStream memory = new MemoryStream();

            bmp.Save(memory, ImageFormat.Bmp);

            foto = memory.ToArray();
        }

        novaFoto = 0;



        SqlCommand cad = new SqlCommand("update Produto set nome = @nome, codigo = @codigo, quant = @quant, preco = @preco, imagem = @imagem, fornecedor = @fornecedor where (nome = '"+nomeBanco+"')", con);

        SqlParameter nome = new SqlParameter("@nome", SqlDbType.VarChar);
        SqlParameter codigo = new SqlParameter("@codigo", SqlDbType.Int);
        SqlParameter quant = new SqlParameter("@quant", SqlDbType.Int);
        SqlParameter preco = new SqlParameter("@preco", SqlDbType.Float);
        SqlParameter imagem = new SqlParameter("@imagem", SqlDbType.Binary);
        SqlParameter fornecedor = new SqlParameter("@fornecedor", SqlDbType.VarChar);
        //AQUIIIIIIIIIIIIIIIII antes tava foto;
        nome.Value = textBox1.Text;
        codigo.Value = int.Parse(textBox2.Text);
        fornecedor.Value = textBox3.Text;
        preco.Value = float.Parse(textBox4.Text);
        quant.Value = int.Parse(textBox5.Text);
        imagem.Value = foto;


        cad.Parameters.Add(nome);
        cad.Parameters.Add(codigo);
        cad.Parameters.Add(quant);
        cad.Parameters.Add(preco);
        cad.Parameters.Add(imagem);
        cad.Parameters.Add(fornecedor);





        try
        {


            con.Open();
            cad.ExecuteNonQuery();
            MessageBox.Show("alterado com sucesso!");
            pictureBox1.Image = null;
            textBox1.Clear();
            textBox2.Clear();
            textBox4.Clear();
            textBox5.Clear();
            textBox3.Clear();

        }

        catch (Exception E)
        {
            MessageBox.Show(E.Message);

        }

        finally
        {
            con.Close();
            pesquisar();
        }



    }

    private void textBox6_KeyUp(object sender, KeyEventArgs e)
    {
        pesquisar();
    }
  • completely ignoring code problems, the error being displayed is because you only fill in the variable foto when novafoto != 0 (you could simply use a bool here), when it is =0, the variable is not assigned and has no value in the parameter. Still, if you pass null, able to remove the photo from the database.

1 answer

0

Try it this way:

bool novaFoto = false;
byte [] foto;
Bitmap bmp;

private void Button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        bmp = new Bitmap(openFileDialog1.FileName);

        pictureBox1.Image = bmp;
        novaFoto = true;
    }
}

string nomeBanco;

private void button2_Click(object sender, EventArgs e)
{
    string Sql = "UPDATE Produto SET nome = @nome, codigo = @codigo, quant = @quant, preco = @preco, fornecedor = @fornecedor";
    string Where = $" WHERE nome = '{nomeBanco}'";

    if (novaFoto)
    { 
        MemoryStream memory = new MemoryStream();

        bmp.Save(memory, ImageFormat.Bmp);
        foto = memory.ToArray();

        Sql += ", imagem = @imagem";
    }

    SqlCommand cad = new SqlCommand(Sql + Where, con);

    cad.Parameters.Add("@nome", SqlDbType.VarChar).Value = textBox1.Text;
    cad.Parameters.Add("@codigo", SqlDbType.Int).Value = int.Parse(textBox2.Text);
    cad.Parameters.Add("@quant", SqlDbType.Int).Value = int.Parse(textBox5.Text);
    cad.Parameters.Add("@preco", SqlDbType.Float).Value = float.Parse(textBox4.Text);
    cad.Parameters.Add("@fornecedor", SqlDbType.VarChar).Value = textBox3.Text;

    if (novaFoto)
        cad.Parameters.Add("@imagem", SqlDbType.Binary).Value = foto;

    try
    {
        con.Open();
        cad.ExecuteNonQuery();

        MessageBox.Show("alterado com sucesso!");

        pictureBox1.Image = null;

        textBox1.Clear();
        textBox2.Clear();
        textBox4.Clear();
        textBox5.Clear();
        textBox3.Clear();

        novaFoto = false;
    }

    catch (Exception E)
    {
        MessageBox.Show(E.Message);
    }
    finally
    {
        con.Close();
        pesquisar();
    }
}

I optimized your code a little bit, but the most important difference is even the construction of query SQL with or without the image parameter, depending on whether it is filled or not.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.