0

quiero almacenar en una tabla llamada películas, donde tiene una clave foránea id_genero.

introducir la descripción de la imagen aquí

En la tabla generos la tengo poblada con 4 generos.

introducir la descripción de la imagen aquí

Ahora en C# Tengo paso por string el comando SQL pero me dice que hay un error en la clave foranea id_genero.

 public void Registrar()
        {
            try
            {
                SqlConnection conexion = new SqlConnection("server=EMILIANO-PC ; database=VideoClub ; integrated security = true");
                conexion.Open();
                string cadena = "insert into pelicula(nombre_pelicula,web_pelicula,descripcion,anio,idgenero) values ('" + txtnombre.Text.Trim() + "','" + txtweb.Text.Trim() + "' , '" + txtdescripcion.Text.Trim() + "', '" + txtanio.Text + " ', '" + comboBox1.SelectedValue + " ')";
                SqlCommand comando = new SqlCommand(cadena, conexion);
                comando.ExecuteNonQuery();
                MessageBox.Show("Los datos se guardaron correctamente");

                conexion.Close();
            }

            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());

            }
        }

ahora el error que me sale es el siguiente:

introducir la descripción de la imagen aquí

Le agregue .ToString al SelectValue

Ibarra Emiliano
  • 379
  • 2
  • 4
  • 20

2 Answers2

2

La manera en que estas realizando la consulta es susceptible a una inyección SQL por seguridad debes trabajar con consultas preparadas.

El error que te esta generando probablemente tiene que ver con el SelectedValue. Debes colocar un breakpoint al inicio del método e ir paso a paso revisando las propiedades de los objetos y los controles procurando que ninguno este llegando null.

using (SqlConnection cnx = new SqlConnection("server=EMILIANO-PC; database=VideoClub; integrated security=true"))
{
    using (SqlCommand cmd = new SqlCommand("INSERT INTO pelicula(nombre_pelicula,web_pelicula,descripcion,anio,idgenero) VALUES (@nombre,@web,@descripcion,@anio,@valorSelect)", cnx))
    {
        cmd.Parameters.AddWithValue("@nombre", txtnombre.Text.Trim());
        cmd.Parameters.AddWithValue("@web", txtweb.Text.Trim());
        cmd.Parameters.AddWithValue("@descripcion", txtdescripcion.Text.Trim());
        cmd.Parameters.AddWithValue("@anio", txtanio.Text);
        cmd.Parameters.AddWithValue("@valorSelect", comboBox1.SelectedValue);
        cmd.ExecuteNonQuery();
    }
}
Victor Perdomo
  • 1,916
  • 5
  • 11
1

Hola mi recomendación es que utilices `SqlCommand.Parameters, por que utilizar esta propiedad: Por lo general las variables que insertamos en la base de datos provienen de una caja de texto, lo que significa que en tu caso esta expuesto a ataques malintencionados por lado del usuario.

Este es un ejemplo de como lo puede implementar ya que seria mucho mas fácil de leer el código espero esto te ayude.

public void Registrar()
{
    try
    {
        using(SqlConnection conexion = new SqlConnection("server=EMILIANO-PC ; database=VideoClub ; integrated security = true"));
        {
            conexion.Open();
            string cadena = @"insert into pelicula(nombre_pelicula,web_pelicula,descripcion,anio,idgenero) 
                            values(@nombre,@web,@descripcion,@anio,@valorSelect)";                   
            SqlCommand comando = new SqlCommand(cadena, conexion);
            comando.CommandType = CommandType.Text;
            comando.Parameters.AddWithValue("@nombre", txtnombre.Text.Trim());
            comando.Parameters.AddWithValue("@web", txtweb.Text.Trim());
            comando.Parameters.AddWithValue("@descripcion", txtdescripcion.Text.Trim());
            comando.Parameters.AddWithValue("@anio", txtanio.Text);
            comando.Parameters.AddWithValue("@valorSelect", comboBox1.SelectedValue);

            comando.ExecuteNonQuery();
            MessageBox.Show("Los datos se guardaron correctamente");

            conexion.Close();
        }
    }
    catch (Exception exception)
    {
        MessageBox.Show(exception.ToString());
    }
}

también acuérdate de verificar las variables con pruebas unitarias, para garantizar que el valor es el que necesitas.