es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El objeto no se puede convertir desde DBNull a otros tipos en C#.

Yo escribí este código:

MySqlCommand command1 = new MySqlCommand("SELECT SUM(standard_one) FROM challenge WHERE (SELECT DAYOFWEEK(date)=1) AND challenge_id = @challenge_id and username = @username", db.getConnection());
command1.Parameters.Add("@challenge_id", MySqlDbType.Int32).Value = comboBox1.SelectedItem;
command1.Parameters.Add("@username", MySqlDbType.VarChar).Value = globals.username;

El problema es que a veces este comando devuelve nulo.

¿Cómo puedo verificar si el comando devolverá nulo? ¿Y si es así, devuelve 0?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema de que a veces MySqlCommand devuelve null, se puede utilizar el método ExecuteScalar() para recuperar un solo valor de la base de datos. Si la consulta devuelve null, el método también devolverá null. Para devolver un 0 en lugar de null, se puede utilizar un operador ternario y comprobar si el resultado es null.

    Aquí hay una versión actualizada de tu código que incorpora estos cambios:

    MySqlCommand command1 = new MySqlCommand("SELECT SUM(standard_one) FROM `challenge` WHERE (SELECT DAYOFWEEK(date)=1) AND challenge_id = @challenge_id and username = @username", db.getConnection());
    command1.Parameters.Add("@challenge_id", MySqlDbType.Int32).Value = comboBox1.SelectedItem;
    command1.Parameters.Add("@username", MySqlDbType.VarChar).Value = globals.username;
    
    object result = command1.ExecuteScalar();
    
    int sum = result == null ? 0 : Convert.ToInt32(result);
    

    En la última línea, usamos un operador ternario para comprobar si result es null. Si lo es, asignamos 0 a sum. De lo contrario, convertimos result a un entero y asignamos el valor a sum. De esta manera, si la consulta devuelve null, sum se establecerá en 0 en su lugar.

Comments are closed.