none
No se actualiza mi base de datos valor datagridview c# RRS feed

  • Pregunta

  • Tengo un datagridview donde me muestra una tabla de sql con un datos bit, para poder usar el checkbox que se genera de manera automatica en visual, tengo un boton de guardar donde quiero tomar el valor del checkbox y si lo tomar porque use el messagebox.show (Mi variable); y si me da valor 1 o 0 (bit) pero no realiza cambios en la base de datos, cual es mi error?

    Tengo el siguiente codigo pero no realiza ningun cambio al ejecutarlo:

    private void button3_Click(object sender, EventArgs e)
            {
                SqlConnection Conexion = MiConexion.ObtenerConexion();
                SqlCommand Comando = new SqlCommand("UPDATE Alumnos set [CARTA DE ACEPTACION] = @CARTA_DE_ACEPTACION where Grupo='a'", Conexion);
                foreach (DataGridViewRow Filas in dataGridView1.Rows)
                {

                    Comando.Parameters.Clear();
                    int a = Convert.ToByte(Filas.Cells[7].Value);//Solo lo use para pruebas ya intente con byte y tampoco funciona

                    //Comando.Parameters.AddWithValue("@CARTA_DE_ACEPTACION", Convert.ToByte(Filas.Cells[7].Value));
                    Comando.Parameters.Add(new SqlParameter("@CARTA_DE_ACEPTACION", SqlDbType.Bit)).Value = a;

                    MessageBox.Show(""+a);

                    //Comando.Parameters.AddWithValue("@importecobrado", Convert.ToInt32(Filas.Cells[12].Value));

                    Comando.ExecuteNonQuery();
                }
                Conexion.Close();
            }

    Cuando value = a; lo cambio por un numero, ya sea 1 o 0 se actualiza el checkbox de la base de datos (valor bit)

    Espero me puedan ayudar, gracias de antemano.

                                                  
    jueves, 1 de marzo de 2018 3:42

Respuestas

  • Hay varios puntos de mejoría ciertamente, pero en términos generales no veo por qué no haría la actualización.  Le daré un código más depurado.  Pruébelo y nos cuenta cómo le va.

    private void button3_Click(object sender, EventArgs e)
    {
        using (SqlConnection conn = MiConexion.ObtenerConexion())
        {
            //La conexión debe establecerse.  No veo Open() en su código.
            //¿Acaso el método ObtenerConexion() devuelve la conexión abierta?
            //Si es así, eliminar la siguiente línea.
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("Update Alumnos Set [CARTA DE ACEPTACION] = @cda Where Grupo = 'a'", conn))
            {
                SqlParameter param = new SqlParameter("cda", SqlDbType.Bit);
                cmd.Parameters.Add(param);
                foreach (DataGridViewRow fila in dataGridView1.Rows)
                {
                    param.Value = fila.Cells[7].Value; //Asumo que Value es de tipo object.
                    if (param.Value != null)
                    {
                        cmd.ExecuteNonQuery();
                    }
                    else
                    {
                        System.Diagnostics.Debug.Print("La fila {0} no parece contener un valor en la celda de índice 7.", fila.Row); //Espero que fila tenga una propiedad Row que es el número de fila!
                    }
                }
            }
        }
    }


    Jose R. MCP
    Code Samples





    • Editado webJoseModerator jueves, 1 de marzo de 2018 4:45 Agrego IF para saltar las filas con valores nulos.
    • Marcado como respuesta FelixElGato17 jueves, 1 de marzo de 2018 12:25
    jueves, 1 de marzo de 2018 3:59
    Moderador

Todas las respuestas

  • Hay varios puntos de mejoría ciertamente, pero en términos generales no veo por qué no haría la actualización.  Le daré un código más depurado.  Pruébelo y nos cuenta cómo le va.

    private void button3_Click(object sender, EventArgs e)
    {
        using (SqlConnection conn = MiConexion.ObtenerConexion())
        {
            //La conexión debe establecerse.  No veo Open() en su código.
            //¿Acaso el método ObtenerConexion() devuelve la conexión abierta?
            //Si es así, eliminar la siguiente línea.
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("Update Alumnos Set [CARTA DE ACEPTACION] = @cda Where Grupo = 'a'", conn))
            {
                SqlParameter param = new SqlParameter("cda", SqlDbType.Bit);
                cmd.Parameters.Add(param);
                foreach (DataGridViewRow fila in dataGridView1.Rows)
                {
                    param.Value = fila.Cells[7].Value; //Asumo que Value es de tipo object.
                    if (param.Value != null)
                    {
                        cmd.ExecuteNonQuery();
                    }
                    else
                    {
                        System.Diagnostics.Debug.Print("La fila {0} no parece contener un valor en la celda de índice 7.", fila.Row); //Espero que fila tenga una propiedad Row que es el número de fila!
                    }
                }
            }
        }
    }


    Jose R. MCP
    Code Samples





    • Editado webJoseModerator jueves, 1 de marzo de 2018 4:45 Agrego IF para saltar las filas con valores nulos.
    • Marcado como respuesta FelixElGato17 jueves, 1 de marzo de 2018 12:25
    jueves, 1 de marzo de 2018 3:59
    Moderador
  • Me da el siguiente error 

    Must declare the scalar variable "@cda"

    jueves, 1 de marzo de 2018 4:11
  • Ah ok.  Qué pena!  No agregué el SqlParameter a la colección de parámetros.  Deme 1 minuto y verifique mi código nuevamente.  Deberá tener la corrección.

    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 4:13
    Moderador
  • No me guarda cambios, no se porque :(
    jueves, 1 de marzo de 2018 4:19
  • Cuando pongo un numero en el valor si se actualiza

    osea cuando @cda es 1 o 0

    jueves, 1 de marzo de 2018 4:22
  • Y eso es justamente lo que debe de devolver Convert.ToByte(fila.Cells[7].Value):  Un cero o un uno.  Si está devolviendo otra cosa, entonces dígame qué devuelve.

    O una pregunta más sencilla:  ¿Qué se ve en el Messagebox Si justo antes de ExecuteNonQuery() ponemos la línea MessageBox.Show(fila.Cells[7].Value.ToString());?


    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 4:29
    Moderador
  • Me devuelve true y no un valor numerico
    jueves, 1 de marzo de 2018 4:31
  • Ya le agregue MessageBox.Show(""+param.Value); y si me devuelve 1 pero no realiza el cambio

    jueves, 1 de marzo de 2018 4:33
  • Ok, un Booleano también sirve, pero entonces voy a modificar el código que le di.  Deme otra vez un minuto y actualice para ver el cambio de código.

    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 4:33
    Moderador
  • private void button3_Click(object sender, EventArgs e)
            {
                using (SqlConnection conn = MiConexion.ObtenerConexion())
                {
                    //La conexión debe establecerse.  No veo Open() en su código.
                    //¿Acaso el método ObtenerConexion() devuelve la conexión abierta?
                    //Si es así, eliminar la siguiente línea.
                    using (SqlCommand cmd = new SqlCommand("Update Alumnos Set [CARTA DE ACEPTACION] = @cda Where Grupo = 'a'", conn))
                    {
                        SqlParameter param = new SqlParameter("cda", SqlDbType.Bit);
                        cmd.Parameters.Add(param);
                        foreach (DataGridViewRow fila in dataGridView1.Rows)
                        {
                            param.Value = Convert.ToByte(fila.Cells[7].Value);
                            MessageBox.Show(""+param.Value);
                            cmd.ExecuteNonQuery();
                        }
                    }
                }

    }

    jueves, 1 de marzo de 2018 4:33
  • Es todo lo que tengo de codigo 
    jueves, 1 de marzo de 2018 4:34
  • Listo.  Note el cambio y pruebe nuevamente.

    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 4:36
    Moderador

  •   Mensaje = The parameterized query '(@cda bit)Update Alumnos Set [CARTA DE ACEPTACION] = @cda Where ' expects the parameter '@cda', which was not supplied.
    jueves, 1 de marzo de 2018 4:40
  • Eso dará cuando el Value de la celda es null.  Si tiene celdas con valores y otras no, entonces hay que poner un IF.  Actualizo el código.

    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 4:42
    Moderador
  • Listo.  Agregué una línea de depuración para los casos nulos.  Ojalá y le sirva para determinar cuáles filas arrojan valores nulos.

    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 4:46
    Moderador
  • Ya me funciono muchas gracias pero podrias explicarme el codigo? al no conocerlo no logro entender lo que paso
    jueves, 1 de marzo de 2018 4:50
  • Pues existen varios temas.  Primero que nada, la sentencia using es como que obligatoria para todos los objetos que implementan la interfaz IDisposableSqlConnection y SqlCommand la implementan.  En segundo lugar, no es necesario destruir el SqlParameter cada vez.  Simplemente se crea una vez, se agrega al comando y en el bucle se altera su valor y se ejecuta el comando.

    Luego Convert.ToByte(), pensaría yo, que debió arrojar una excepción cuando se le pasaban valores null.  No sé por qué no le sucedía esto a usted.  ¿Tendrá usted por ahí un try..catch con el catch vacío?  Si es así, ya ve qué malo que es.  Existen muy pocas razones válidas para hacer eso.

    Finalmente, la propiedad Value de un SqlParameter es de tipo object.  No hace falta convertir el valor a priori.  Si es un valor compatible con el tipo de datos SQL, el SqlCommand y el SqlParameter saben entenderse entre ellos.  Creo, si la memoria no me falla, que la única excepción sería cuando uno intencionalmente desea pasar un valor nulo a base de datos.  En ese caso uno suele tener el valor null, pero como ya usted se dio cuenta, este valor no se traduce apropiadamente a NULL de base de datos.  En este caso y como excepción, uno deberá poner un IF (ya sea a modo de sentencia o con el operador ternario : ?) para cambiar el null a DbNull.Value.

    El caso específico de valores tipo bit de SQL Server:  Puede recibir el valor numérico de 0 o 1, o bien puede recibir un Booleano.


    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 5:04
    Moderador
  • Actualmente tengo este codigo para meter los dos valores pero no hay alguna manera de evitar tanto codigo?

    using (SqlCommand cmd = new SqlCommand("Update Alumnos Set [CARTA DE ACEPTACION] = @cda, [1ER REPORTE] = @abc Where Grupo = 'a'", conn)) { SqlParameter parametro = new SqlParameter("cda", SqlDbType.Bit); SqlParameter param1 = new SqlParameter("abc", SqlDbType.Bit); cmd.Parameters.Add(param1); cmd.Parameters.Add(parametro); foreach (DataGridViewRow fila in dataGridView1.Rows) { parametro.Value = fila.Cells[5].Value; param1.Value = fila.Cells[6].Value; if (parametro.Value != null | param1.Value != null) { cmd.ExecuteNonQuery(); } else { System.Diagnostics.Debug.Print("La fila {0} no parece contener un valor en la celda de índice 7.", fila); } }



    jueves, 1 de marzo de 2018 23:22
  • Felix, yo creé una nueva conversación para usted.  Creo que equivocadamente la puse en el foro de Lenguaje C#.  Puede continuar allí.

    Jose R. MCP
    Code Samples

    jueves, 1 de marzo de 2018 23:24
    Moderador