0

Tengo una tabla llamada Usuarios y dicha tabla tiene una columna llamada Status_admin de tipo bit (es aquí donde se le asigna el tipo de privilegio al usuario, ya sea admin o usuario). Y en el windowsform tengo dos radiobutton para la asignación del tipo de privilegio. Pero me causa error al momento de correrlo. ¿Alguien que me ayude por favor?

código del botón "agregar usuario"

private void btnadd_Click(object sender, EventArgs e)
{
    conexion.Open();
    SqlCommand cmd = conexion.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "insert into Usuarios values ('" + txtname.Text.Trim() + "', '" + txtlastname.Text.Trim() + "', '" + txtuser.Text.Trim() + "', '" + txtpassword.Text.Trim() + "', '"+nivel+"')";
    cmd.ExecuteNonQuery();
    disp_data();
    conexion.Close();
    MessageBox.Show("Un nuevo usuario ah sido agregado.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
    clear();
}

radiobuttons

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    nivel = "1";
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
    nivel = "0";
}

Agregado de comentarios de OP

Este es el mensaje de error que me arroja el Visual Studio:

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll. Additional information: Column name or number of supplied values does not match table definition.

Mi tabla Usuarios está compuesta por 6 columnas, que son: id_usuario, Nombre, Apellido, Username, Password y Status_admin. Todos los campos son de tipo char a excepción de Status_admin que es bit.

sstan
  • 16,591
  • 2
  • 21
  • 45
Eduardo Parra
  • 61
  • 3
  • 12
  • 1
    *me causa error al momento de correrlo*: Pues, for favor incluye los detalles del error. No podemos adivinar. También descríbenos tu tabla `Usuarios` y los tipos de sus campos. Y finalmente, te animo a examinar el tema siguiente: [¿Qué es la inyección SQL y cómo puedo evitarla?](http://es.stackoverflow.com/questions/10518/qu%C3%A9-es-la-inyecci%C3%B3n-sql-y-c%C3%B3mo-puedo-evitarla/) – sstan Oct 29 '16 at 21:53
  • Este es el mensaje de error que me arroja el Visual Studio: An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll. Additional information: Column name or number of supplied values does not match table definition. Mi tabla Usuarios esta compuesta por 6 columnas que son: id_usuario, Nombre, Apellido, Username, Password y Status_admin. Todos los campos son de tipo char a excepcion de Status_admin que es bit. – Eduardo Parra Oct 30 '16 at 01:57

2 Answers2

1

Mi tabla Usuarios está compuesta por 6 columnas que son: id_usuario, Nombre, Apellido, Username, Password y Status_admin.

Allí está el problema. Usando tu sentencia insert actual:

insert into usuarios values (@nombre, @apellido, @username, @password, @nivel);

... la base de datos espera que le des valores para las 6 columnas y en el orden definido en tu tabla. En este caso, solo le estás dando 5 valores, porque no necesitas darle id_usuario.

Para corregir el error, cambia la sintaxis del insert para definir explícitamente a cuáles columnas deseas pasar valores y en qué orden:

insert into usuarios (nombre, apellido, username, password, status_admin) -- esta es la parte importante
values (@nombre, @apellido, @username, @password, @nivel);

Notas adicionales

Como comentaron otros, una columna de tipo bit puedes pasarle 0 o 1 en vez de '0' o '1'. Pero ambos deberían funcionar.

Te recomiendo evitar concatenar los valores que quieres insertar directamente en tu SQL. Mas bien, usa la sintaxis que te permite pasarlos como parámetros. Puedes encontrar más información en cuanto a por qué no es buena idea concatenar los valores en el SQL directamente aquí: ¿Qué es la inyección SQL y cómo puedo evitarla?.

Edición

Aunque es mejor que cambies el código para usar parámetros, mientras tanto, este es el cambio mínimo que necesitas para resolver tu problema por ahora.

Cambia este línea:

cmd.CommandText = "insert into Usuarios values ('" + txtname.Text.Trim() + "', '" + txtlastname.Text.Trim() + "', '" + txtuser.Text.Trim() + "', '" + txtpassword.Text.Trim() + "', '"+nivel+"')";

... a:

cmd.CommandText = "insert into Usuarios (nombre, apellido, username, password, status_admin) values ('" + txtname.Text.Trim() + "', '" + txtlastname.Text.Trim() + "', '" + txtuser.Text.Trim() + "', '" + txtpassword.Text.Trim() + "', '"+nivel+"')";

Una vez que te funcione, puedes irle haciendo mas mejoras.

sstan
  • 16,591
  • 2
  • 21
  • 45
  • Hola sstan, cambie la sintaxis como me explicaste y sigue sin funcionar. Ahora me aparece este error: An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll Additional information: Conversion failed when converting the varchar value 'nivel' to data type bit. – Eduardo Parra Oct 30 '16 at 02:47
  • Hola Eduardo, la idea con el ejemplo que te dí no era que cambiaras la parte después de `VALUES (...`. Solo era para que vieras que debías incluir los nombres de las columnas: `INSERT INTO tabla (col1, col2, col3) VALUES (...`. El error que tienes es porque copiastes literalmente el valor `'nivel'`. – sstan Oct 30 '16 at 02:51
  • Aún me sigue causando error :/ seguiré revisando a ver que puedo hacer, se que no es algo complicado de resolver pero como no estoy muy familiarizado con esto de la programacion batallo algo jaja de todas formas muchisimas gracias por tu valiosa ayuda sstan! – Eduardo Parra Oct 30 '16 at 03:10
  • @Eduardo: Modifiqué la respuesta para incluir el cambio exacto que necesitas por ahora. – sstan Oct 30 '16 at 03:17
  • 1
    Muchisimas gracias sstan, ahora si me funcionó a la perfección! Ya puedo dar de alta al usuario, ahora el detalle es que me arroja un nuevo error que dice que "la conexión no fue cerrada. El estado actual de la conexión esta abierta", si no es una cosa es la otra jaja. – Eduardo Parra Oct 30 '16 at 03:54
-1

No sé si entendí bien la pregunta porque no especificaste cuál es el mensaje de error que recibes. En SQL Server el valor de un campo bit en realidad es un boolean, es decir, está expresado en True y False, no con 1 y 0.

Si el error que tienes ocurre en SQL, entoncces es porque estás enviando un 0 o 1 como int o como char o varchar, prueba usando boolean: True y False.

Gustavo
  • 1
  • 1
  • base de datos el valor de un campo bit esta expresado por 0 y 1. El valor de dentro de un lenguaje es interpretado 1 = true y 0 = false! – sioesi Oct 29 '16 at 22:54
  • El mensaje de error es este: An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll. Additional information: Column name or number of supplied values does not match table definition. – Eduardo Parra Oct 30 '16 at 02:02