isdbnull c# mysql null dbnull mysqldatareader

c# - isdbnull - ¿Cómo verificar NULL en MySqlDataReader por el nombre de la columna?



reader is null c# (8)

¿Cómo puedo verificar un valor NULL en un MySqlDataReader abierto?

Lo siguiente no funciona; siempre está golpeando al else :

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

rdr.IsDbNull(int i) solo acepta un número de columna, no un nombre.


Aquí hay un método que creé para leer DBNull y devolver un caso default(T) caso de:

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

Se puede utilizar así:

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 tipo genérico T se resolverá en función del valor de retorno del reader. - metodo Si devuelve una cadena, recibirá un null caso de DBNull . Si es un int devolverá 0 , etc.

Nota: para valores enteros, es posible que no se desee obtener un 0 así que tenga cuidado.


Aquí hay uno que me gusta:

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");


Cambiar null a DBNull.Value .


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


Puede comparar el objeto que se recupera del campo NULL con DBNull.Value .


También puedes hacer:

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


if (rdr.GetString ("timeOut") == DBNull.Value)

null no es lo mismo que DBNull

Lo siento, respuesta incorrecta, Sam B tiene razón. Lo confundí con cosas de DataRow .

SqlDataReader sí tiene tipeado GetString() y proporciona IsDBNull(int column) para este caso.


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