Pregunta

¿Cómo puedo comprobar un valor NULL en un MySqlDataReader abierta?

La siguiente no funciona; siempre está golpeando la else:

if (rdr.GetString("timeOut") == null)
{
    queryResult.Egresstime = "Logged in";
}
else
{
    queryResult.Egresstime = rdr.GetString("timeOut");
}

rdr.IsDbNull(int i) sólo acepta un número de columna, no el nombre.

¿Fue útil?

Solución

var ordinal = rdr.GetOrdinal("timeOut");
if(rdr.IsDBNull(ordinal)) {
  queryResult.Egresstime = "Logged in";
} else {
  queryResult.Egresstime = rdr.GetString(ordinal);
}//if

o

if(Convert.IsDBNull(rdr["timeOut"])) {
  queryResult.Egresstime = "Logged in";
} else {
  queryResult.Egresstime = rdr.GetString("timeOut");
}//if

Otros consejos

si (rdr.GetString ( "Tiempo de espera") == DBNull.Value)

null no es lo mismo que DBNull

Lo siento, respuesta incorrecta, Sam B es correcto. Me confundí esta para cosas DataRow.

SqlDataReader han inflexible de tipos GetString() y proporciona IsDBNull(int column) para este caso.

Debe llamar rdr.IsDBNull(column) para determinar si el valor es DbNull.

Se puede comparar el objeto que recuperar de campo nulo con DBNull .Value .

Cambiar null a DBNull.Value.

También puede hacer:

If (string.IsNullOrEmpty(rdr.GetString("timeOut"))

Aquí hay uno que me gustan:

var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");

por ejemplo (para el requisito original):.

queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");

Aquí es un método que he creado para leer DBNull y devolver un caso que default(T):

   private T GetNullable<T>(MySqlDataReader reader, int ordinal, Func<int, T> getValue)
        {
            if (reader.IsDBNull(ordinal))
            {
                return default(T);
            }
            return getValue(ordinal);
        }

Puede ser utilizado como esto:

   if (reader.Read())
            {
                account = new Account();
                account.Id = reader.GetInt32(0);
                account.Name = reader.GetString(1);
                account.MailVerifiedAt = GetNullable(reader, 2, reader.GetDateTime);
                account.MailToken = GetNullable(reader, 3, reader.GetString);
            }

El T tipo genérico se resolverá basado en el valor de retorno del método reader.-. Si se devuelve una cadena que recibirá un caso que null de DBNull. Si se trata de un int se volverá 0, etc.

Nota:. Para valores enteros que podría no ser conveniente para obtener una 0 así que tenga cuidado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top