Question

Comment puis-je vérifier une valeur NULL dans une MySqlDataReader ouverte?

Ce qui suit ne fonctionne pas; il est frappant toujours le else:

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

rdr.IsDbNull(int i) accepte uniquement un numéro de colonne, pas le nom.

Était-ce utile?

La solution

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

ou

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

Autres conseils

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

null n'est pas la même chose que DBNull

Je suis désolé, mauvaise réponse, Sam B est juste. Je prenais cela pour des trucs DataRow.

SqlDataReader ne sont fortement typé GetString() et fournit IsDBNull(int column) pour ce cas.

Vous devez appeler rdr.IsDBNull(column) pour déterminer si la valeur est DbNull.

Vous pouvez comparer l'objet retrive du champ NULL avec DBNull .value.

Modifier null à DBNull.Value.

Vous pouvez également faire:

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

Voici que je préfère:

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

par exemple (pour l'exigence initiale).

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

Voici une méthode que j'ai créé pour lire DBNull et retourner un Incase de default(T):

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

Il peut être utilisé comme ceci:

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

Le T de type générique sera résolu en fonction de la valeur de retour de la méthode reader.-. Si elle retourne une chaîne, vous recevrez un Incase de null de DBNull. Si elle est un int il retournera 0, etc.

Note:. Pour les valeurs entières il pourrait ne pas être souhaitable d'obtenir un 0 alors soyez prudent

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top