Cómo comprobar NULL en MySqlDataReader por el nombre de la columna?
-
12-10-2019 - |
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.
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