Usuario
Error al actualizar registros usando formularios con comboBox

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.
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.
-
-
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();
- Propuesto como respuesta webJoseModerator jueves, 17 de mayo de 2018 19:38