none
Error al actualizar registros usando formularios con comboBox RRS feed

  • Pregunta

  • Tengo un problema al actualizar los campos de mi tabla. Dentro del formulario cuento con un comboBox donde muestro los campos de mi tabla de tipo Varchar pero al seleccionar uno de ellos me guarde el id de ese departamento. Mi problema se genera al actualizar mostrando el siguiente error  " ErroSystem.SqlClient.SqlException(0x80131904): Conversion failed when converting the varchar value 'Compras' to data type int".

    Para modificar mi registro, primero realizó la busqueda mediante un botón BUSCAR donde lee el número de control de la persona. Con el siguiente método.

    public void buscarNumeroControl()
            {
                // string cod = textBox1.Text;
                try
                {
                    string cadena = "SELECT nombre, apellidoP, depto FROM Personal INNER JOIN  Departamento ON Personal.id_Depto=Departamento.id_Depto WHERE id_numControl='" + textBox1.Text + "' ";
                    SqlCommand cmd = new SqlCommand(cadena, con);
                    con.Open();
                    SqlDataReader registro = cmd.ExecuteReader();
                    if (registro.Read() == true)
                    {
                        textBox2.Text = registro["nombre"].ToString();
                        textBox3.Text = registro["apellidoP"].ToString();
                        comboDepto.Text = registro["depto"].ToString();
                        actualizar.Enabled = true;
                    }
                    else
                    {
                        MessageBox.Show("No existe un artículo con el código ingresado");
    
                    }
                    con.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error" + ex.ToString());
                }
    
            }

    El comboBox lo lleno de la siguiente manera.

     public void llenarcomboboxDepto()
            {
                try{
                con.Open();
                DataSet dsd = new DataSet();
    
                SqlDataAdapter cmd = new SqlDataAdapter("SELECT id_Depto, depto FROM Departamento", con);
                //se indica con que tabla se llena
                
                cmd.Fill(dsd, "Departamento");
    
                comboDepto.DataSource = dsd.Tables[0].DefaultView;
    
                //indicamos el valor de los miembros
    
                comboDepto.ValueMember = "id_Depto";
    
                //se indica el valor a desplegar en el combobox
    
                comboDepto.DisplayMember = "depto";
                con.Close();
                 }
                catch (Exception ex)
                {
                    MessageBox.Show("Error" + ex.ToString());
                } 
            }
     

    y para modificar tengo el botón ACTUALIZAR invocando el siguiente método.

    public void modificarRegistro()
            {
                try
                {
                    con.Open();
                    string cadena = "UPDATE Personal set nombre='" + textBox2.Text + "', apellidoP='" + textBox3.Text + "' , id_Depto='" + comboDepto.Text + "'  WHERE id_numControl='" + textBox1.Text + "'";
                    SqlCommand comando = new SqlCommand(cadena, con);
                    int cant;
                    cant = comando.ExecuteNonQuery();
                    if (cant == 1)
                    {
                        MessageBox.Show("Se modificaron los datos correctamente");
                        textBox1.Text = "";
                        textBox2.Text = "";
                        textBox3.Text = "";
                        comboDepto.Text = "";
                        con.Close();
                    }
                    else
                    {
                        MessageBox.Show("No existe la persona con ese numero de control");
    
                        actualizar.Enabled = false;
                    }
                    // }
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error" + ex.ToString());
                }
            }

    No se en que parte este mal, siento que no me esta recuperando el id del departamento que estoy seleccionado. Alguien podria ayudarme porfavor.

    miércoles, 16 de mayo de 2018 17:48

Todas las respuestas

  • Según el mensaje de error, estás mandando a grabar un texto donde tendrías que meter un número. Y eso ocurre en esta sentencia:

    string cadena = "UPDATE Personal set nombre='" + textBox2.Text + "', apellidoP='" + textBox3.Text + "' , id_Depto='" + comboDepto.Text + "'  WHERE id_numControl='" + textBox1.Text + "'";

    Fíjate que pones id_Depto (que se supone que es un INT) igual a comboDepto.Text. Pero comboDepto.Text es el NOMBRE del departamento, no el ID. Seguramente lo que pretendías usar es comboDepto.SelectedValue.

    Ojo, fíjate que la sentencia SQL lo encierra entre comillas simples. Esto solo se hace con los campos de texto; si este campo es numérico se debe poner sin las comillas.

    Aprovecho para recordarte lo que siempre decimos en el foro cuando alguien pone una sentencia como esta: OJO, es vulnerable ante inyecciones de SQL. Nunca se debe concatenar en una sentencia SQL un dato introducido por el usuario. En su lugar se debe parametrizar la sentencia. Además de ser más seguro y más eficiente, parametrizar la sentencia tiene la ventaja de que no tienes que meter ninguna de las comillas en ningún sitio, con lo que no tienes el problema mencionado antes de que a este campo hay que quitarle las comillas pero los otros campos sí que tienen que llevarlas.

    miércoles, 16 de mayo de 2018 21:12
    Moderador
  • Hola buen dia Alberto. Podrias darme un ejemplo de como parametrizar mi sentencia porfavor.

    Gracias por tu ayuda!!

    jueves, 17 de mayo de 2018 13:27
  • string cadena = "UPDATE Personal set nombre=@nom, apellidoP=@ape , id_Depto=@idDep WHERE id_numControl=@idNC";
    SqlCommand comando = new SqlCommand(cadena, con);
    comando.Parameters.AddWithValue("@nom", textBox2.Text);
    comando.Parameters.AddWithValue("@ape", textBox3.Text);
    comando.Parameters.AddWithValue("@idDep", comboDepto.SelectedValue);
    comando.Parameters.AddWithValue("@idNC", textBox1.Text);
    int cant = comando.ExecuteNonQuery();
    

    jueves, 17 de mayo de 2018 15:57
    Moderador